{
"cells": [
{
"cell_type": "markdown",
"id": "a29bd84f-dbd8-49b9-92cd-f9f2b9c63a64",
"metadata": {
"id": "d6c54d8e"
},
"source": [
"\n",
"---"
]
},
{
"cell_type": "markdown",
"id": "8c36f26c-4f74-4eca-a0e0-e812dffb4787",
"metadata": {
"id": "d6c54d8e"
},
"source": [
"# Case Study in NLP\n",
"\n",
"Copyright, NLP from scratch, 2024.\n",
"\n",
"[NLPfor.me](https://www.nlpfor.me)\n",
"\n",
"------------"
]
},
{
"cell_type": "markdown",
"id": "a89bc555-4c5c-49c2-bee1-e9edea062627",
"metadata": {},
"source": [
"In this notebook, we will work through a case study in NLP. You are working with a client which has a website for reviews of products and services, and the product manager on the business side has come with the following ask:\n",
"\n",
"> As we continue to receive an increasing volume of customer feedback on our website, it has become evident that manual categorization of reviews is not only time-consuming but also prone to errors. To improve our efficiency, enhance the overall user experience, and better utilize customer insights, leadership is proposing we develop a machine learning model to automatically categorize reviews into three primary categories: retail, restaurants, and movies, as these make up our largest categories of reviews and searches."
]
},
{
"cell_type": "markdown",
"id": "6aa8a109-4a0c-4808-87f3-162a4daf0434",
"metadata": {},
"source": [
"We will work through developing an MVP for the above business problem. Let's get started!"
]
},
{
"cell_type": "markdown",
"id": "cb5d20f3",
"metadata": {
"id": "d2109366"
},
"source": [
"## Data Loading and Exploration\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "54998616-ac84-4621-9176-f060bf9adb6c",
"metadata": {},
"source": [
"First we will import the \"holy trinity\" of data science in Python: [numpy](https://numpy.org) for working with numeric data, [pandas](https://pandas.pydata.org/) for working with structured data, and [matplotlib](https://matplotlib.org) for data visualization.\n",
"\n",
"For working with processing text data and doing machine learning (with [scikit-learn](https://scikit-learn.org)), we will import the relevant modules and classes as needed."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "13e19005-ca24-4efd-8b2a-e5851a7f5973",
"metadata": {},
"outputs": [],
"source": [
"# Holy trinity\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"id": "e7be2dfd-1695-436f-a6f6-51b903cfa925",
"metadata": {},
"source": [
"Next we will read in the data we will be working with. To build an MVP model, we will be using a dataset which is a combination of reviews from Amazon.com (for retail products / electronics), Rottentomatoes (for movies), and Yelp (for restaurants). This data is available on the [NLP from scratch datasets github repo](https://github.com/nlpfromscratch/datasets/tree/master/amazon_rt_yelp).\n",
"\n",
"We can read the data in directly with `pd.read_csv`, as it can retrieve files directly from a URL! There is no need to download it:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "a9352e67-9938-472c-b227-933d7f7851bb",
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv('https://raw.githubusercontent.com/nlpfromscratch/datasets/refs/heads/master/amazon_rt_yelp/amazon_rt_yelp.csv')"
]
},
{
"cell_type": "markdown",
"id": "ea613404-ef62-4e66-9b2d-52d069cdc422",
"metadata": {},
"source": [
"Let's take a look at what we are working with:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "8d98409c-a430-4646-92cb-b0cecce2e6e2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
text
\n",
"
source
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
I picked up a jar of fresh-made salsa and chip...
\n",
"
yelp
\n",
"
\n",
"
\n",
"
1
\n",
"
The husband and I had driven by Hula's multipl...
\n",
"
yelp
\n",
"
\n",
"
\n",
"
2
\n",
"
Had some amazing cuisine at Milagro's. The che...
\n",
"
yelp
\n",
"
\n",
"
\n",
"
3
\n",
"
Chill coffee bar. That is the best way to desc...
\n",
"
yelp
\n",
"
\n",
"
\n",
"
4
\n",
"
Fancy shop with great kitchen items that I wo...
\n",
"
yelp
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" text source\n",
"0 I picked up a jar of fresh-made salsa and chip... yelp\n",
"1 The husband and I had driven by Hula's multipl... yelp\n",
"2 Had some amazing cuisine at Milagro's. The che... yelp\n",
"3 Chill coffee bar. That is the best way to desc... yelp\n",
"4 Fancy shop with great kitchen items that I wo... yelp"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "markdown",
"id": "c1497c38-a377-4609-b21c-09f3e5e55130",
"metadata": {},
"source": [
"We can see we have two columns, `text`, which has the free-form review text, and a `source` column which appears to have a text description of the source."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "8510715d-2f8c-40a1-a7b1-716b607281e2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(15000, 2)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.shape"
]
},
{
"cell_type": "markdown",
"id": "260a425c-0643-4fac-985f-265bcd0ef6ed",
"metadata": {},
"source": [
"There are 15,000 reviews in the dataset. What are the distinct values in the `source` column?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "c40491a5-d872-41ef-8784-109c684b9fb4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['yelp', 'rottentomatoes', 'amazon'], dtype=object)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['source'].unique()"
]
},
{
"cell_type": "markdown",
"id": "af598cda-452a-4890-91b2-21fa9c9b7588",
"metadata": {},
"source": [
"Let's dive deeper here and check if the distribution of different review types is uniform:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "e5f74da6-7e1b-4755-8777-21682090d0a9",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAo0AAAGzCAYAAABKNS0NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5dUlEQVR4nO3deXxN1/7/8feJyCQTkiBEEhIzoYY2iKGiMRalVXWLKjXWTGlvDR1ulFLa24HbW9NVWtqq1jwXVUpFa2gQgraGmhJDiyTr94df9tdpsDVCDK/n43Eej5y111n7s1eO5t119t7HYYwxAgAAAK7DJbcLAAAAwJ2P0AgAAABbhEYAAADYIjQCAADAFqERAAAAtgiNAAAAsEVoBAAAgC1CIwAAAGwRGgEAAGCL0AgAt0laWpqGDBmikJAQubi4qGXLlrldkpKTk+VwODR16tTcLsVWvXr1VKFChdwuA7hvERoB3FZJSUnq1q2bSpQoIQ8PD/n6+qpWrVqaOHGi/vjjj9wuT5L03nvv3ZIQ9dFHH2ns2LFq06aNpk2bpv79++f4PgDgVnHw3dMAbpcFCxbo8ccfl7u7uzp06KAKFSro4sWLWrdunT777DN16tRJkydPzu0yVaFCBQUEBGj16tU5Ou6TTz6pdevW6ZdffsnRcW+GMUYXLlxQ3rx5lSdPntwu57rq1aun48ePa/v27bldCnBfcs3tAgDcH/bv368nn3xSoaGhWrlypYoUKWJt69Wrl/bu3asFCxbkYoW33rFjx+Tv75+t1xpj9Oeff8rT0zNHa3I4HPLw8MjRMZEzzp8/Ly8vr9wuA7Dw8TSA22LMmDE6e/as/vvf/zoFxkwRERHq27ev9TwtLU2vvvqqSpYsKXd3d4WFhenFF1/UhQsXnF7ncDg0cuTILOOFhYWpU6dO1vOpU6fK4XBo/fr1GjBggAIDA5UvXz61atVKv//+u9PrduzYoTVr1sjhcMjhcKhevXrXPbZz585p4MCBCgkJkbu7u0qXLq0333xTmR/kZJ43uGrVKu3YscMa93ormWFhYWrWrJmWLFmiatWqydPTU5MmTZIknT59Wv369bP2FxERoTfeeEMZGRmSpEuXLqlAgQJ65plnsoybmpoqDw8PDRo0yKm2v34c//PPP6tNmzYqUKCAPDw8VK1aNc2fP9/afvr0aeXJk0dvv/221Xb8+HG5uLioYMGCuvJDrB49eqhw4cLW8z179qh169YqXLiwPDw8VKxYMT355JNKSUm57jxn2rJli2rWrClPT0+Fh4frgw8+sLadPXtW+fLlc3ovZfrll1+UJ08excfHX3f82bNnq2rVqvLx8ZGvr68qVqyoiRMnOvXZt2+fHn/8cRUoUEBeXl566KGHsvxPT+Z7Ljk52al99erVWX7/medrbtmyRXXq1JGXl5defPFFSdKff/6pkSNHqlSpUvLw8FCRIkX02GOPKSkpyXp9RkaGJkyYoPLly8vDw0OFChVSt27ddOrUqeseK/B3EBoB3BZfffWVSpQooZo1a95Q/y5dumj48OF64IEH9NZbb6lu3bqKj4/Xk08+eVN1PP/889q2bZtGjBihHj166KuvvlLv3r2t7RMmTFCxYsVUpkwZzZgxQzNmzNBLL710zfGMMXr00Uf11ltvqVGjRho/frxKly6twYMHa8CAAZKkwMBAzZgxQ2XKlFGxYsWsccuWLXvdWhMTE9WuXTs1bNhQEydOVOXKlXX+/HnVrVtX//vf/9ShQwe9/fbbqlWrloYNG2btL2/evGrVqpXmzZunixcvOo05b948Xbhw4brzuGPHDj300EPatWuXhg4dqnHjxilfvnxq2bKlvvjiC0mSv7+/KlSooG+++cZ63bp16+RwOHTy5Ent3LnTal+7dq1iYmIkSRcvXlRcXJy+++47Pf/883r33Xf13HPPad++fTp9+vR150OSTp06pSZNmqhq1aoaM2aMihUrph49euijjz6SJHl7e6tVq1b65JNPlJ6e7vTaWbNmyRij9u3bX3P8ZcuWqV27dsqfP7/eeOMNjR49WvXq1dP69eutPkePHlXNmjW1ZMkS9ezZU6+//rr+/PNPPfroo9b8ZMeJEyfUuHFjVa5cWRMmTFD9+vWVnp6uZs2aadSoUapatarGjRunvn37KiUlxelj+m7dumnw4MHW+cHPPPOMZs6cqbi4OF26dCnbNQFODADcYikpKUaSadGixQ31T0hIMJJMly5dnNoHDRpkJJmVK1dabZLMiBEjsowRGhpqOnbsaD2fMmWKkWRiY2NNRkaG1d6/f3+TJ08ec/r0aautfPnypm7dujdU67x584wk89prrzm1t2nTxjgcDrN3716rrW7duqZ8+fI3NG5oaKiRZBYvXuzU/uqrr5p8+fKZ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OyXYyjwPcMGCBSpatKjTtr+Gnbx581o/Zx5XRkbGTddw5biZY1+tLXNfycnJatasmXr06KHXX39dBQoU0Lp16/Tss8/q4sWL1wxwN+Ls2bPq1q2b+vTpk2Vb8eLF5ebmph9++EGrV6/W0qVLNXz4cI0cOVLff/89V2sDAIDshcatW7c6Pb906ZK2bt2q8ePHZ7mw4+8oW7asPvvsMxljrPC2fv16+fj4qFixYpIkNze3LKHUzc1NknNYLVeunNzd3XXw4EGn8xf/rqvtr2zZsjp06JAOHTrk9PH06dOnVa5cuWzva8uWLcrIyNC4ceOs1chPP/30hupJS0vTxo0bnT6eTkxMtOp54IEHtHPnTkVERFxz/66uroqNjVVsbKxGjBghf39/rVy5Uo899li2jwkAANwbshUao6KisrRVq1ZNwcHBGjt2bLZDRs+ePTVhwgQ9//zz6t27txITEzVixAgNGDDAClFhYWHauHGjkpOT5e3trQIFCig0NFQOh0Nff/21mjRpIk9PT/n4+GjQoEHq37+/MjIyVLt2baWkpGj9+vXy9fVVx44db6imsLAw7d+/XwkJCSpWrJh8fHwUGxurihUrqn379powYYLS0tLUs2dP1a1bV9WqVcvWsUtSRESELl26pHfeeUfNmzfX+vXr9cEHH2Sp5+zZs1qxYoWioqLk5eWlyMhItWjRQl27dtWkSZPk4+OjoUOHqmjRomrRooUk6YUXXtBDDz2k3r17q0uXLsqXL5927typZcuW6d///re+/vpr7du3T3Xq1FH+/Pm1cOFCZWRkqHTp0tk+HgAAcO/I1i13rqV06dL6/vvvs/36okWLauHChdbtfLp3765nn31W//znP60+gwYNUp48eVSuXDkFBgbq4MGDKlq0qEaNGqWhQ4eqUKFC6t27t6TL35H98ssvKz4+XmXLllWjRo20YMEChYeH33BNrVu3VqNGjVS/fn0FBgZq1qxZcjgc+vLLL5U/f37VqVNHsbGxKlGihD755JNsH7t0OYyPHz9eb7zxhipUqKCZM2cqPj7eqU/NmjXVvXt3tW3bVoGBgRozZowkacqUKapataqaNWum6OhoGWO0cOFC6+PwSpUqac2aNdq9e7diYmJUpUoVDR8+XMHBwZIkf39/ff7553r44YdVtmxZffDBB5o1a5bKly9/U8cEAADuDdm6evqv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mj17ts6dO6fo6Gjm/Dbo1auXmjZtmmV+mPtba8+ePQoODlaJEiXUvn17HTx4UNLdNe+ERtyU48ePKz093emNLEmFChXSkSNHcqmqe0vmPF5vjo8cOaKgoCCn7a6uripQoIBTn6uNceU+7mcZGRnq16+fatWqpQoVKki6PC9ubm7y9/d36vvXubeb12v1SU1N1R9//HErDueO99NPP8nb21vu7u7q3r27vvjiC5UrV445v8Vmz56tH374QfHx8Vm2Mfe3zoMPPqipU6dq8eLFev/997V//37FxMTozJkzd9W8u+bIKABwl+vVq5e2b9+udevW5XYp94XSpUsrISFBKSkpmjt3rjp27Kg1a9bkdln3tEOHDqlv375atmyZPDw8cruc+0rjxo2tnytVqqQHH3xQoaGh+vTTT+Xp6ZmLlf09rDTipgQEBChPnjxZrvI6evSoChcunEtV3Vsy5/F6c1y4cGEdO3bMaXtaWppOnjzp1OdqY1y5j/tV79699fXXX2vVqlUqVqyY1V64cGFdvHhRp0+fdur/17m3m9dr9fH19b2r/mDkJDc3N0VERKhq1aqKj49XVFSUJk6cyJzfQlu2bNGxY8f0wAMPyNXVVa6urlqzZo3efvttubq6qlChQsz9beLv769SpUpp7969d9V7ntCIm+Lm5qaqVatqxYoVVltGRoZWrFih6OjoXKzs3hEeHq7ChQs7zXFqaqo2btxozXF0dLROnz6tLVu2WH1WrlypjIwMPfjgg1afb775RpcuXbL6LFu2TKVLl1b+/Plv09HcWYwx6t27t7744gutXLlS4eHhTturVq2qvHnzOs19YmKiDh486DT3P/30k1NoX7ZsmXx9fVWuXDmrz5VjZPbh38j/ycjI0IULF5jzW6hBgwb66aeflJCQYD2qVaum9u3bWz8z97fH2bNnlZSUpCJFitxd7/kcu6QG963Zs2cbd3d3M3XqVLNz507z3HPPGX9/f6ervHB9Z86cMVu3bjVbt241ksz48ePN1q1bzYEDB4wxl2+54+/vb7788kvz448/mhYtWlz1ljtVqlQxGzduNOvWrTORkZFOt9w5ffq0KVSokHn66afN9u3bzezZs42Xl9d9fcudHj16GD8/P7N69WqnW2GcP3/e6tO9e3dTvHhxs3LlSrN582YTHR1toqOjre2Zt8J45JFHTEJCglm8eLEJDAy86q0wBg8ebHbt2mXefffd+/oWJEOHDjVr1qwx+/fvNz/++KMZOnSocTgcZunSpcYY5vx2uvLqaWOY+1tl4MCBZvXq1Wb//v1m/fr1JjY21gQEBJhjx44ZY+6eeSc0Ike88847pnjx4sbNzc3UqFHDfPfdd7ld0l1l1apVRlKWR8eOHY0xl2+78/LLL5tChQoZd3d306BBA5OYmOg0xokTJ0y7du2Mt7e38fX1Nc8884w5c+aMU59t27aZ2rVrG3d3d1O0aFEzevTo23WId6SrzbkkM2XKFKvPH3/8YXr27Gny589vvLy8TKtWrczhw4edxklOTjaNGzc2np6eJiAgwAwcONBcunTJqc+qVatM5cqVjZubmylRooTTPu43nTt3NqGhocbNzc0EBgaaBg0aWIHRGOb8dvpraGTub422bduaIkWKGDc3N1O0aFHTtm1bs3fvXmv73TLvDmOMybl1SwAAANyLOKcRAAAAtgiNAAAAsEVoBAAAgC1CIwAAAGwRGgEAAGCL0AgAAABbhEYAAADYIjQCAADAFqERAAAAtgiNAAAAsEVoBAAAgK3/B5QO0xy0KnXaAAAAAElFTkSuQmCC",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure()\n",
"df['source'].value_counts().plot(kind='barh')\n",
"plt.title('Count of reviews by source')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "0f45e2fc-c127-4bf4-879a-7bec53d4972f",
"metadata": {},
"source": [
"It is, we have 5K reviews for each of the three different review types (amazon, rottentomatoes, and yelp). There is not too much else to be done in terms of exploratory data analysis as we only have text and categorical features, but let's take a look at the length of the reviews and their distribution:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "4731e742-3036-4f91-b1b4-f2888f570c7a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAGGCAYAAACNL1mYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABQqklEQVR4nO3deVRV9f7/8ReDIKIHnAAxBRyus5YT4VhJojnUzW6aXFMztcTKNFPrpjaaVo63tOFe7abl0K/MNElSUzMypRwz03LMAEsBcUCBz+8PF/vrERSws+Foz8daZy3P3p+993t/2HB8nT18PIwxRgAAAAAAwBaepV0AAAAAAADXM4I3AAAAAAA2IngDAAAAAGAjgjcAAAAAADYieAMAAAAAYCOCNwAAAAAANiJ4AwAAAABgI4I3AAAAAAA2IngDAAAAAGAjgjcAXGTixIny8PAokW3dcsstuuWWW6z3X375pTw8PPThhx+WyPYHDBig8PDwEtnW1crMzNSDDz6okJAQeXh4aMSIEaVdUoHCw8M1YMCA0i6jUHnH9++//17apbilAwcOyMPDQ6+++upVLZ/3O/zll1+6trAi4ucLAO6L4A3gujVv3jx5eHhYr7Jlyyo0NFQxMTGaOXOmTp486ZLtHD16VBMnTtTWrVtdsj5XcufaiuKll17SvHnz9PDDD+u9995Tv379Lts2PDzc6eft7++v1q1b63//+18JVgzpwpdKjRs3Lu0yLuuzzz7TxIkTS7uMIsvJydHcuXN1yy23qFKlSvL19VV4eLgGDhyoLVu2lHZ5LvH+++9r+vTppV0GANjGu7QLAAC7Pffcc4qIiND58+eVnJysL7/8UiNGjNDUqVO1bNkyNW3a1Gr7r3/9S2PHji3W+o8ePapnn31W4eHhuvHGG4u83KpVq4q1natxpdrefvtt5ebm2l7Dn7FmzRrdfPPNmjBhQpHa33jjjRo1apQk6bffftM777yj/v37KysrS4MHD7atzj179sjTk++yrxWfffaZXn/9dZeH7w4dOujMmTPy8fFx2TrPnDmju+++W/Hx8erQoYOeeuopVapUSQcOHNDixYv17rvv6tChQ7rhhhtcts3S8P7772vnzp1ue1ULAPxZBG8A172uXbuqZcuW1vtx48ZpzZo16t69u3r27Kndu3fLz89PkuTt7S1vb3v/NJ4+fVrlypVz6X/Or0aZMmVKdftFkZqaqoYNGxa5ffXq1fXPf/7Tej9gwADVqlVL06ZNszV4+/r62rZuXDs8PT1VtmxZl65z9OjRio+P17Rp0/KF0gkTJmjatGku3V5hjDE6e/as9TfTneXm5urcuXMu/5kAwNXg63kAf0m33XabnnnmGR08eFDz58+3phd0j3dCQoLatWunwMBAlS9fXvXq1dNTTz0l6cI9na1atZIkDRw40LrMed68eZL+75LbpKQkdejQQeXKlbOWvfQe7zw5OTl66qmnFBISIn9/f/Xs2VOHDx92anO5e4ovXmdhtRV0j/epU6c0atQo1ahRQ76+vqpXr55effVVGWOc2nl4eGj48OFaunSpGjduLF9fXzVq1Ejx8fEFd/glUlNTNWjQIAUHB6ts2bJq1qyZ3n33XWt+3r2y+/fv14oVK6zaDxw4UKT156latarq16+vn3/+2Wl6bm6upk+frkaNGqls2bIKDg7W0KFDdeLECatN9+7dVatWrQLXGxUV5fRlTkE/j7S0NI0YMcLqyzp16mjy5MlOVxk0b95cd999t9NyTZo0kYeHh7Zv325NW7RokTw8PLR7925J0smTJzVixAiFh4fL19dXQUFBuv322/Xdd98VqV9+//133XvvvXI4HKpcubIee+wxnT171prfsWNHNWvWrMBl69Wrp5iYmCJtpzArV65U+/bt5e/vrwoVKqhbt27atWuXU5sBAwaofPny+vXXX3XXXXepfPnyqlq1qp544gnl5OQ4tf3jjz/Ur18/ORwOBQYGqn///tq2bVu+4/7111+XJKdbEy711ltvqXbt2vL19VWrVq20efPmQvenoHu88/4G/PDDD7r11ltVrlw5Va9eXVOmTCl0fUeOHNGbb76p22+/vcAzwV5eXnriiSfyne1OS0vTgAEDFBgYqICAAA0cOFCnT592ajN37lzddtttCgoKkq+vrxo2bKjZs2fn20Z4eLi6d++uzz//XC1btpSfn5/efPPNYq1DuvCz7tixoypUqCCHw6FWrVrp/ffft/poxYoVOnjwoPXzuPhvU1ZWliZMmKA6derI19dXNWrU0JNPPqmsrCynbeT9XVqwYIEaNWokX19f62/SwoUL1aJFC2v7TZo00YwZM678AwAAF+KMN4C/rH79+umpp57SqlWrLns2dNeuXerevbuaNm2q5557Tr6+vtq3b582btwoSWrQoIGee+45jR8/XkOGDFH79u0lSW3atLHW8ccff6hr167q06eP/vnPfyo4OPiKdb344ovy8PDQmDFjlJqaqunTpys6Olpbt24t1lmmotR2MWOMevbsqbVr12rQoEG68cYb9fnnn2v06NH69ddf851Z++qrr/TRRx9p2LBhqlChgmbOnKlevXrp0KFDqly58mXrOnPmjG655Rbt27dPw4cPV0REhJYsWaIBAwYoLS1Njz32mBo0aKD33ntPjz/+uG644Qbr8vGqVasWef8lKTs7W0eOHFHFihWdpg8dOlTz5s3TwIED9eijj2r//v3697//re+//14bN25UmTJl1Lt3b91///3avHmz9QWGJB08eFDffPONXnnllctu9/Tp0+rYsaN+/fVXDR06VDVr1tTXX3+tcePG6bfffrPuZW3fvr0++OADa7njx49r165d8vT01IYNG6zbIDZs2KCqVauqQYMGkqSHHnpIH374oYYPH66GDRvqjz/+0FdffaXdu3erefPmhfbLvffeq/DwcE2aNEnffPONZs6cqRMnTlj3w/fr10+DBw/Wzp07ne7V3rx5s3766Sf961//KnQbhXnvvffUv39/xcTEaPLkyTp9+rRmz56tdu3a6fvvv3cKXjk5OYqJiVFkZKReffVVffHFF3rttddUu3ZtPfzww5IufJnSo0cPffvtt3r44YdVv359ffLJJ+rfv7/TdocOHaqjR48qISFB7733XoG1vf/++zp58qSGDh0qDw8PTZkyRXfffbd++eWXq7pS5MSJE+rSpYvuvvtu3Xvvvfrwww81ZswYNWnSRF27dr3scitXrlR2dvYVn21QkHvvvVcRERGaNGmSvvvuO73zzjsKCgrS5MmTrTazZ89Wo0aN1LNnT3l7e+vTTz/VsGHDlJubq7i4OKf17dmzR/fdd5+GDh2qwYMHq169esVax7x58/TAAw+oUaNGGjdunAIDA/X9998rPj5effv21dNPP6309HQdOXLE+jtTvnx5SRd+rj179tRXX32lIUOGqEGDBtqxY4emTZumn376SUuXLnWqdc2aNVq8eLGGDx+uKlWqKDw8XAkJCbrvvvvUqVMnqw92796tjRs36rHHHitW3wLAVTMAcJ2aO3eukWQ2b9582TYBAQHmpptust5PmDDBXPyncdq0aUaSOXbs2GXXsXnzZiPJzJ07N9+8jh07Gklmzpw5Bc7r2LGj9X7t2rVGkqlevbrJyMiwpi9evNhIMjNmzLCmhYWFmf79+xe6zivV1r9/fxMWFma9X7p0qZFkXnjhBad299xzj/Hw8DD79u2zpkkyPj4+TtO2bdtmJJlZs2bl29bFpk+fbiSZ+fPnW9POnTtnoqKiTPny5Z32PSwszHTr1u2K67u4befOnc2xY8fMsWPHzI4dO0y/fv2MJBMXF2e127Bhg5FkFixY4LR8fHy80/T09HTj6+trRo0a5dRuypQpxsPDwxw8eNBp2xf/PJ5//nnj7+9vfvrpJ6dlx44da7y8vMyhQ4eMMcYsWbLESDI//PCDMcaYZcuWGV9fX9OzZ0/Tu3dva7mmTZuav//979b7gIAAp30qqrzju2fPnk7Thw0bZiSZbdu2GWOMSUtLM2XLljVjxoxxavfoo48af39/k5mZecXtdOzY0TRq1Oiy80+ePGkCAwPN4MGDnaYnJyebgIAAp+n9+/c3ksxzzz3n1Pamm24yLVq0sN7/v//3/4wkM336dGtaTk6Oue222/L9DsTFxZmC/gu0f/9+I8lUrlzZHD9+3Jr+ySefGEnm008/veJ+5/0Or1271pqW9zfgf//7nzUtKyvLhISEmF69el1xfY8//riRZL7//vsrtsuT9/N94IEHnKb//e9/N5UrV3aadvr06XzLx8TEmFq1ajlNCwsLM5JMfHx8vvZFWUdaWpqpUKGCiYyMNGfOnHFqm5uba/27W7duTn+P8rz33nvG09PTbNiwwWn6nDlzjCSzceNGa5ok4+npaXbt2uXU9rHHHjMOh8NkZ2fnWz8AlBQuNQfwl1a+fPkrPt08MDBQkvTJJ59c9YPIfH19NXDgwCK3v//++1WhQgXr/T333KNq1arps88+u6rtF9Vnn30mLy8vPfroo07TR40aJWOMVq5c6TQ9OjpatWvXtt43bdpUDodDv/zyS6HbCQkJ0X333WdNK1OmjB599FFlZmZq3bp1V70Pq1atUtWqVVW1alU1adJE7733ngYOHOh0dnrJkiUKCAjQ7bffrt9//916tWjRQuXLl9fatWslSQ6HQ127dtXixYudLrVftGiRbr75ZtWsWfOydSxZskTt27dXxYoVnbYRHR2tnJwcrV+/XpKsqxDy3m/YsEGtWrXS7bffrg0bNki6cNnwzp07rbbSheNy06ZNOnr06FX106VnNB955BFJso6xgIAA3Xnnnfrggw+sfc/JydGiRYt01113yd/f/6q2mychIUFpaWm67777nPrHy8tLkZGR1s/gYg899JDT+/bt2zsda/Hx8SpTpozT1Suenp759rUoevfu7XSVRF7fF3ZsX0758uWdnj3g4+Oj1q1bF7q+jIwMSXL6e1AUBfXVH3/8Ya1PktPVM+np6fr999/VsWNH/fLLL0pPT3daPiIiosDbC4qyjoSEBJ08eVJjx47Nd691UYZuXLJkiRo0aKD69es7HSu33XabJOU7Vjp27JjvuRCBgYE6deqUEhISCt0eANiF4A3gLy0zM/OK/6nt3bu32rZtqwcffFDBwcHq06ePFi9eXKwQXr169WI9SK1u3bpO7z08PFSnTp1i399cXAcPHlRoaGi+/si7vPngwYNO0wsKnhUrVnS6T/py26lbt26+p4BfbjvFERkZqYSEBMXHx+vVV19VYGCgTpw44dT/e/fuVXp6uoKCgqyQnvfKzMxUamqq1bZ37946fPiwEhMTJUk///yzkpKS1Lt37yvWsXfvXsXHx+dbf3R0tCRZ2wgODlbdunWtkL1hwwa1b99eHTp00NGjR/XLL79o48aNys3NdQreU6ZM0c6dO1WjRg21bt1aEydOLFYovPQYq127tjw9PZ2Osfvvv1+HDh2yavviiy+UkpJS7MueC7J3715JF561cGkfrVq1yulnIElly5bNd5vBpcfawYMHVa1aNZUrV86pXZ06dYpd36XHdl4IL+zYvpwbbrghX8gsyu+Kw+GQpGIPfViU+jdu3Kjo6Gj5+/srMDBQVatWtZ4/UVDwLkhR1pH3fIWrHV5u79692rVrV77j5G9/+5sk5TtWCqp12LBh+tvf/qauXbvqhhtu0AMPPFDk51EAgKtwjzeAv6wjR44oPT39iv8x9/Pz0/r167V27VqtWLFC8fHxWrRokW677TatWrVKXl5ehW7Hjqf/Xu5MUU5OTpFqcoXLbcdc8iC2klSlShUr3MbExKh+/frq3r27ZsyYoZEjR0q6cM9oUFCQFixYUOA6Lg54PXr0ULly5bR48WK1adNGixcvlqenp/7xj39csY7c3FzdfvvtevLJJwucnxcaJKldu3ZavXq1zpw5o6SkJI0fP16NGzdWYGCgNmzYoN27d6t8+fK66aabrGXuvfdetW/fXh9//LFWrVqlV155RZMnT9ZHH310xXuGL6eg4ykmJkbBwcGaP3++OnTooPnz5yskJMTq3z8j74ur9957TyEhIfnmXzqyQEkd04Vt72qP7atdX/369SVJO3bsKNZQhYVt7+eff1anTp1Uv359TZ06VTVq1JCPj48+++wzTZs2Ld8XiwX9DSvuOq5Wbm6umjRpoqlTpxY4v0aNGoXWGhQUpK1bt+rzzz/XypUrtXLlSs2dO1f333+/00MdAcBOBG8Af1l5D1Yq7AnNnp6e6tSpkzp16qSpU6fqpZde0tNPP621a9cqOjq6SJdLFkfe2cA8xhjt27fPabzxihUrKi0tLd+yBw8edHoSd3FqCwsL0xdffKGTJ086nfX+8ccfrfmuEBYWpu3btys3N9fprLertyNJ3bp1U8eOHfXSSy9p6NCh8vf3V+3atfXFF1+obdu2hX4p4u/vr+7du2vJkiWaOnWqFi1apPbt2ys0NPSKy9WuXVuZmZlFCqnt27fX3LlztXDhQuXk5KhNmzby9PRUu3btrODdpk2bfGGqWrVqGjZsmIYNG6bU1FQ1b95cL774YpGC9969e53ODO7bt0+5ublODzTz8vJS3759NW/ePE2ePFlLly7V4MGDXRKC825RCAoKckmQly4cN2vXrrWG68uzb9++fG1d/Ttrl65du8rLy0vz5893yZUGeT799FNlZWVp2bJlTmfHC7rE/8+uI+9nvXPnzit+yXm5n0nt2rW1bds2derU6U/93Hx8fNSjRw/16NFDubm5GjZsmN58800988wzV3VVBAAUF5eaA/hLWrNmjZ5//nlFREQoNjb2su2OHz+eb1remae8oWzy7nctKAhfjf/9739Ol5Z++OGH+u2335wCVe3atfXNN9/o3Llz1rTly5fnG3asOLXdcccdysnJ0b///W+n6dOmTZOHh8dVnUm93HaSk5O1aNEia1p2drZmzZql8uXLq2PHji7ZTp4xY8bojz/+0Ntvvy3pwtninJwcPf/88/naZmdn5+ur3r176+jRo3rnnXe0bdu2Qi8zz9tGYmKiPv/883zz0tLSlJ2dbb3Pu4R88uTJatq0qQICAqzpq1ev1pYtW5wuM8/Jycl3KXBQUJBCQ0PzDa90OXnDaeWZNWuWJOX7Gffr108nTpzQ0KFDlZmZ6XSf8p8RExMjh8Ohl156SefPn883/9ixY1e1zvPnz1s/Z+nC2dJL91Vy/e+sXWrUqKHBgwdr1apV1s/oYrm5uXrttdd05MiRYq0378uTi8+4p6ena+7cuS5fR+fOnVWhQgVNmjTJaci6S5f19/fPd1xLF36Xfv31V6efa54zZ87o1KlThdb6xx9/OL339PS0vsgs6u8MAPxZnPEGcN1buXKlfvzxR2VnZyslJUVr1qxRQkKCwsLCtGzZsnwP/LnYc889p/Xr16tbt24KCwtTamqq3njjDd1www1q166dpAshODAwUHPmzFGFChXk7++vyMjIy94XWZhKlSqpXbt2GjhwoFJSUjR9+nTVqVPH6aFRDz74oD788EN16dJF9957r37++WfNnz/f6WFnxa2tR48euvXWW/X000/rwIEDatasmVatWqVPPvlEI0aMyLfuqzVkyBC9+eabGjBggJKSkhQeHq4PP/xQGzdu1PTp04v9IKnCdO3aVY0bN9bUqVMVFxenjh07aujQoZo0aZK2bt2qzp07q0yZMtq7d6+WLFmiGTNm6J577rGWv+OOO1ShQgU98cQT8vLyUq9evQrd5ujRo7Vs2TJ1795dAwYMUIsWLXTq1Cnt2LFDH374oQ4cOKAqVapIunAPckhIiPbs2WM95EySOnTooDFjxkiSU/A+efKkbrjhBt1zzz1q1qyZypcvry+++EKbN2/Wa6+9VqQ+2b9/v3r27KkuXbooMTFR8+fPV9++ffON3X3TTTepcePG1gOuijJUWZ5jx47phRdeyDc978uu2bNnq1+/fmrevLn69OmjqlWr6tChQ1qxYoXatm2b7wugwtx1111q3bq1Ro0apX379ql+/fpatmyZ9eXZxWdLW7RoIUl69NFHFRMTIy8vL/Xp06dY2yspr732mn7++Wc9+uij+uijj9S9e3dVrFhRhw4d0pIlS/Tjjz8Wu/bOnTtbZ4DzvlR5++23FRQUpN9++82l63A4HJo2bZoefPBBtWrVSn379lXFihW1bds2nT592rrUu0WLFlq0aJFGjhypVq1aqXz58urRo4f69eunxYsX66GHHtLatWvVtm1b5eTk6Mcff9TixYut8cWv5MEHH9Tx48d122236YYbbtDBgwc1a9Ys3XjjjdazJQDAdqX0NHUAsF3ecGJ5Lx8fHxMSEmJuv/12M2PGDKdhq/JcOpzY6tWr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5vvvvzfff/+9kWSmTp1qvv/+e3Pw4EFjzIWhDQIDA80nn3xitm/fbu68884Chza46aabzKZNm8xXX31l6tat6zREQFpamgkODjb9+vUzO3fuNAsXLjTlypX7U0MbXKnukydPmieeeMIkJiaa/fv3my+++MI0b97c1K1b15w9e7ZU63744YdNQECA+fLLL52GXTh9+rTVxhXHRd6wI6NHjza7d+82r7/++lUPO1JYzfv27TPPPfec2bJli9m/f7/55JNPTK1atUyHDh1KrWZjjBk7dqxZt26d2b9/v9m+fbsZO3as8fDwMKtWrTLGuF8/F6Vud+3rglz6FF937e8r1e2u/V0Sny129PWV6nbXvjbmwlBz3t7e5sUXXzR79+41CxYsMOXKlTPz58+32rjbZ2VhNbvz52ROTo6pWbOmGTNmTL557npsX6ludz62+/fvb6pXr24NzfXRRx+ZKlWqmCeffNJq427HdmE1u/OxHR8fb1auXGl++eUXs2rVKtOsWTMTGRlpzp07Z4xxv74uSt3u1t8E7xI0a9YsU7NmTePj42Nat25tvvnmm1Ktp3fv3qZatWrGx8fHVK9e3fTu3dtpDM0zZ86YYcOGmYoVK5py5cqZv//97+a3335zWseBAwdM165djZ+fn6lSpYoZNWqUOX/+vMtqXLt2rZGU79W/f39jzIWhJJ555hkTHBxsfH19TadOncyePXuc1vHHH3+Y++67z5QvX944HA4zcOBAc/LkSac227ZtM+3atTO+vr6mevXq5uWXX7at7tOnT5vOnTubqlWrmjJlypiwsDAzePDgfF/ClEbdBdUsycydO9dq46rjYu3atebGG280Pj4+platWk7bcGXNhw4dMh06dDCVKlUyvr6+pk6dOmb06NFOY5SWdM3GGPPAAw+YsLAw4+PjY6pWrWo6depkhW5j3K+fi1K3u/Z1QS4N3u7a31eq2137u6Q+W1zd11eq2137Os+nn35qGjdubHx9fU39+vXNW2+95TTfHT8rr1SzO39Ofv7550ZSvv4zxn2P7SvV7c7HdkZGhnnsscdMzZo1TdmyZU2tWrXM008/7TSkk7sd24XV7M7H9qJFi0ytWrWMj4+PCQkJMXFxcSYtLc2a7259XZS63a2/PYwxpujnxwEAAAAAQHFwjzcAAAAAADYieAMAAAAAYCOCNwAAAAAANiJ4AwAAAABgI4I3AAAAAAA2IngDAAAAAGAjgjcAAAAAADYieAMAAAAAYCOCNwAAAAAANiJ4AwAAAABgI4I3AAAAAAA2IngDAAAAAGCj/w9USo7/FBCx9gAAAABJRU5ErkJggg==",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,4))\n",
"df['text'].str.len().hist(bins=500, grid=False)\n",
"plt.xticks(np.arange(0, 10000, 500))\n",
"plt.title('Distribution of Reviews by Length in Characters')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "6aabb9ca-b74a-448f-b4c6-e8303036d300",
"metadata": {},
"source": [
"We can see the review lengths are not normally distributed but follow a very long-tailed distribution with the vast majority of reviews being between 0-500 characters in length."
]
},
{
"cell_type": "markdown",
"id": "c2e51144-2c5c-43b7-a692-2bde70ca22c8",
"metadata": {},
"source": [
"## Data preprocessing and transformation"
]
},
{
"cell_type": "markdown",
"id": "3dbb0bef-b8b6-4942-a438-be0785c83954",
"metadata": {},
"source": [
"Now that we have taken a look at the data we are working with, we will clean and preprocess the data in order to apply a machine learning model to predict the data source (review category).\n",
"\n",
"Let's take a look at the `text` column:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b833638e-0e35-4595-ba61-f4029c45e2b8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 I picked up a jar of fresh-made salsa and chip...\n",
"1 The husband and I had driven by Hula's multipl...\n",
"2 Had some amazing cuisine at Milagro's. The che...\n",
"3 Chill coffee bar. That is the best way to desc...\n",
"4 Fancy shop with great kitchen items that I wo...\n",
" ... \n",
"14995 This is a great tablet for the price. Amazon i...\n",
"14996 This tablet is the perfect size and so easy to...\n",
"14997 Purchased this for my son. Has room to upgrade...\n",
"14998 I had some thoughts about getting this for a 5...\n",
"14999 this is a steal, have 8 gb model as well.This ...\n",
"Name: text, Length: 15000, dtype: object"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['text']"
]
},
{
"cell_type": "markdown",
"id": "df0c9f40-e0a4-4ca2-a2d9-a481f7306f50",
"metadata": {},
"source": [
"For the first step in preprocessing we will remove capitals by converting all the reviews to entirely lowercase:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "84599312-df2f-4983-91c9-2cdfa093d334",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 i picked up a jar of fresh-made salsa and chip...\n",
"1 the husband and i had driven by hula's multipl...\n",
"2 had some amazing cuisine at milagro's. the che...\n",
"3 chill coffee bar. that is the best way to desc...\n",
"4 fancy shop with great kitchen items that i wo...\n",
" ... \n",
"14995 this is a great tablet for the price. amazon i...\n",
"14996 this tablet is the perfect size and so easy to...\n",
"14997 purchased this for my son. has room to upgrade...\n",
"14998 i had some thoughts about getting this for a 5...\n",
"14999 this is a steal, have 8 gb model as well.this ...\n",
"Name: text, Length: 15000, dtype: object"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 1. Remove capitals\n",
"df['text'] = df['text'].str.lower()\n",
"df['text']"
]
},
{
"cell_type": "markdown",
"id": "06f1570c-b880-4e4a-97d5-e35d856db61a",
"metadata": {},
"source": [
"Next we remove punctuation:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "1fe8523a-2307-409a-9b79-9406dcbff83b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"!\t\"\t#\t$\t%\t&\t'\t(\t)\t*\t+\t,\t-\t.\t/\t:\t;\t<\t=\t>\t?\t@\t[\t\\\t]\t^\t_\t`\t{\t|\t}\t~\t"
]
}
],
"source": [
"# 2. Removing punctuation\n",
"import string\n",
"\n",
"for mark in string.punctuation:\n",
" print(mark, end='\\t')\n",
" df['text'] = df['text'].str.replace(mark, '')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "9b18627f-1d06-42b0-8890-30ddc9b81678",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 i picked up a jar of freshmade salsa and chips...\n",
"1 the husband and i had driven by hulas multiple...\n",
"2 had some amazing cuisine at milagros the chef ...\n",
"3 chill coffee bar that is the best way to descr...\n",
"4 fancy shop with great kitchen items that i wo...\n",
" ... \n",
"14995 this is a great tablet for the price amazon is...\n",
"14996 this tablet is the perfect size and so easy to...\n",
"14997 purchased this for my son has room to upgrade ...\n",
"14998 i had some thoughts about getting this for a 5...\n",
"14999 this is a steal have 8 gb model as wellthis ha...\n",
"Name: text, Length: 15000, dtype: object"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check\n",
"df['text']"
]
},
{
"cell_type": "markdown",
"id": "54fd3ec4-8c47-41dc-b7f8-ab864584c91e",
"metadata": {},
"source": [
"Let's check if there are any other special characters besides punctuation. Are there newline characters such as `\\n` present?"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "71324fe1-4397-4557-85d4-db71c8f1d5f1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 i picked up a jar of freshmade salsa and chips...\n",
"4 fancy shop with great kitchen items that i wo...\n",
"5 uhoh where am i \\n\\nthe view from atop the mou...\n",
"7 having been to dave busters in california i w...\n",
"10 my husband and i went tonight to teakwoods for...\n",
" ... \n",
"4983 i dont frequent tempe too often but when i do ...\n",
"4986 this would most certainly be my coffee shop if...\n",
"4988 i came here on saturday becuase i had to get m...\n",
"4990 oh orange table what can i say about you i am ...\n",
"4996 where to start\\n\\nthe owners are very kind say...\n",
"Name: text, Length: 2788, dtype: object"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['text'][df['text'].str.contains('\\n')]"
]
},
{
"cell_type": "markdown",
"id": "db8c84f4-8ee7-45a5-bf4d-a79704eced6b",
"metadata": {},
"source": [
"There are. Let's replace all special characters such as newlines and tabs with whitespace using a regular expression:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "6eb15b1c-f531-4cb1-bfed-876fe97daa85",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 i picked up a jar of freshmade salsa and chips...\n",
"1 the husband and i had driven by hulas multiple...\n",
"2 had some amazing cuisine at milagros the chef ...\n",
"3 chill coffee bar that is the best way to descr...\n",
"4 fancy shop with great kitchen items that i wou...\n",
" ... \n",
"14995 this is a great tablet for the price amazon is...\n",
"14996 this tablet is the perfect size and so easy to...\n",
"14997 purchased this for my son has room to upgrade ...\n",
"14998 i had some thoughts about getting this for a 5...\n",
"14999 this is a steal have 8 gb model as wellthis ha...\n",
"Name: text, Length: 15000, dtype: object"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Use regular expression to remove special characters\n",
"df['text'] = df['text'].str.replace(r\"[\\s\\t\\n\\r]+\", \" \", regex=True)\n",
"df['text']"
]
},
{
"cell_type": "markdown",
"id": "365bd624-89c4-45e7-b2a0-ce9a75713126",
"metadata": {},
"source": [
"Great, that is the extent of the normalization we will do in preprocessing. We will not be doing stemming nor removing stopwords as the latter is done in the vectorization and tokenization step.\n",
"\n",
"Let's wrap all the preprocessing in a convenient function here, as we may need to duplicate this process later:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "43cda8e0-86ab-45ce-8a52-711f169b63f5",
"metadata": {},
"outputs": [],
"source": [
"# Wrap all the preprocessing in a function\n",
"def preprocess_text(text_column: pd.Series):\n",
" '''\n",
" This function takes a pandas series, text_column as input.\n",
" '''\n",
" \n",
" # Copy the column\n",
" output_column = text_column.copy()\n",
"\n",
" # Make lower case\n",
" output_column = output_column.str.lower()\n",
" \n",
" # Remove punctuation\n",
" for mark in string.punctuation:\n",
" output_column = output_column.str.replace(mark, '')\n",
"\n",
" # Remove extra whitespace and special characters\n",
" output_column = output_column.str.replace(r\"[\\s\\t\\n\\r]+\", \" \", regex=True)\n",
"\n",
" # Return the updated text column\n",
" return output_column"
]
},
{
"cell_type": "markdown",
"id": "1d659de1-4751-4de6-8cd5-2b7f4782a255",
"metadata": {},
"source": [
"We've used a [docstring](https://peps.python.org/pep-0257/) in our function, so can get usage information using `help`: "
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "f4d2b6d2-20c2-4dd3-9e51-8eb463ee2cc4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Help on function preprocess_text in module __main__:\n",
"\n",
"preprocess_text(text_column: pandas.core.series.Series)\n",
" This function takes a pandas series, text_column as input.\n",
"\n"
]
}
],
"source": [
"help(preprocess_text)"
]
},
{
"cell_type": "markdown",
"id": "90fecf88-a553-4c01-b093-e954972d1e38",
"metadata": {},
"source": [
"We should probably also quickly unit test our function to make sure it works properly. Let's give it 3 reviews with capitalization, punctuation, and special characters and see if they are addressed successfully:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "d593fbf8-4c23-4bf6-a5f1-839b2abb4088",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 this movie was awful\n",
"1 wasnt that bad\n",
"2 never watching a movie from this director again\n",
"dtype: object"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Unit test?\n",
"movie_reviews = [\"This movie was AWFUL.\", \"Wasn't that bad!!!!\", \"Never watching a movie \\n\\n from this director \\t again\"]\n",
"movie_reviews = pd.Series(movie_reviews)\n",
"\n",
"preprocess_text(movie_reviews)"
]
},
{
"cell_type": "markdown",
"id": "6c9029cb-b5ea-46d4-ad77-3019362c708a",
"metadata": {},
"source": [
"We should also check that there are no side effects and that the original dataframe is unmodified by the function:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "9fa8185b-61e1-4325-aa34-b1d1baf35d7f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 This movie was AWFUL.\n",
"1 Wasn't that bad!!!!\n",
"2 Never watching a movie \\n\\n from this director...\n",
"dtype: object"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check that original data is unmodified\n",
"movie_reviews"
]
},
{
"cell_type": "markdown",
"id": "d9d8012b-8560-4625-b51f-5d3b88ee5fd4",
"metadata": {},
"source": [
"We can see that it is, so we are confident that our function does what it needs to without issue."
]
},
{
"cell_type": "markdown",
"id": "92f37f08-44e3-4e30-8164-35f69b4d718c",
"metadata": {},
"source": [
"### Tokenization and Vectorization"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "84b43056-440c-4c4a-91e7-3ca7c5679a54",
"metadata": {},
"source": [
"In this section we will now perform tokenization and vectorization, converting the unstructured text data of the reviews into numeric data that is suitable for analytics and/or machine learning. Both these steps can be done together using the `CountVectorizer` from sklearn to tokenize, vectorize, and remove stopwords from the preprocessed text:\n",
"\n",
"https://scikit-learn.org/1.5/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html\n",
"\n",
"To use the CountVectorizer, we import from the `feature_extraction.text` submodule, then instantiate and fit and transform the reviews:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "2de4bce6-fb38-4533-ad42-e50ef77e87ed",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.feature_extraction.text import CountVectorizer\n",
"\n",
"# Instantiate\n",
"cv = CountVectorizer(stop_words='english')\n",
"\n",
"# Tokenize, vectorize, and remove stopwords\n",
"# DOCUMENT-TERM MATRIX\n",
"dtm = cv.fit_transform(df['text'])"
]
},
{
"cell_type": "markdown",
"id": "f2bb6082-a41c-4e07-9fa4-152422a7366a",
"metadata": {},
"source": [
"Let's check what is returned:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "77501b2b-efef-4d61-ac30-c14542610c0d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<15000x33715 sparse matrix of type ''\n",
"\twith 365222 stored elements in Compressed Sparse Row format>"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dtm"
]
},
{
"cell_type": "markdown",
"id": "92fdc844-5f42-4fa9-a439-8cf65aafb8f6",
"metadata": {},
"source": [
"Our [document-term matrix](https://en.wikipedia.org/wiki/Document-term_matrix) is returned as a spare dataframe since there are a large number of zeros, since most words only occur in a small number of reviews. Let's plunk into a Pandas Dataframe to make this easier to see:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "29924e42-856b-4159-ac4b-ba05c3ff62df",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
00
\n",
"
007
\n",
"
01
\n",
"
01042012
\n",
"
03342
\n",
"
039
\n",
"
050
\n",
"
06
\n",
"
07092008
\n",
"
075
\n",
"
...
\n",
"
äúshow
\n",
"
äúskills
\n",
"
äústar
\n",
"
äúthings
\n",
"
école
\n",
"
ém
\n",
"
ótimo
\n",
"
ôºå
\n",
"
única
\n",
"
único
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
...
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
\n",
"
\n",
"
1
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
...
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
\n",
"
\n",
"
2
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
...
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
\n",
"
\n",
"
3
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
...
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
\n",
"
\n",
"
4
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
...
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
\n",
" \n",
"
\n",
"
5 rows × 33715 columns
\n",
"
"
],
"text/plain": [
" 00 007 01 01042012 03342 039 050 06 07092008 075 ... äúshow \\\n",
"0 0 0 0 0 0 0 0 0 0 0 ... 0 \n",
"1 0 0 0 0 0 0 0 0 0 0 ... 0 \n",
"2 0 0 0 0 0 0 0 0 0 0 ... 0 \n",
"3 0 0 0 0 0 0 0 0 0 0 ... 0 \n",
"4 0 0 0 0 0 0 0 0 0 0 ... 0 \n",
"\n",
" äúskills äústar äúthings école ém ótimo ôºå única único \n",
"0 0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 0 0 \n",
"\n",
"[5 rows x 33715 columns]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Put in a nice pandas dataframe\n",
"dtm_df = pd.DataFrame(dtm.toarray(), columns=cv.get_feature_names_out())\n",
"dtm_df.head()"
]
},
{
"cell_type": "markdown",
"id": "009165aa-5129-4c24-ae29-b7720f5b071f",
"metadata": {},
"source": [
"We can see that each column corresponds to the count of each a token as a feature, however, the matrix appears to be mostly zeroes. How many elements are in the matrix?"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "6050eca8-7079-4e65-9a29-f18902485306",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"505,725,000\n"
]
}
],
"source": [
"print(f'{dtm_df.shape[0]*dtm_df.shape[1]:,}')"
]
},
{
"cell_type": "markdown",
"id": "ed181780-a06f-46b3-952d-59958314caaa",
"metadata": {},
"source": [
"There are a whopping ~505M elements in the matrix! But how many of these are non-zero? We use the `365,222` value of non-zero elements returned from the original sparse representation above to calculate this:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "1b835356-4d93-4916-8db9-ad1208f53ecf",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9992778249048396"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"1-(365222/505725000)"
]
},
{
"cell_type": "markdown",
"id": "222fbe19-6779-457f-962a-b756a9ef45f7",
"metadata": {},
"source": [
"The matrix is ~99.93% zeros! We can see the \"long tail of language\" if we look at the frequency of total occurrences of tokens in the data in a histogram:"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "ddec4c86-1d9c-42a8-bfda-9bf5f8ad00c5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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KChwP18xcOBAPfDAA1q4cKFuuukmjRo1SpI8/gJ/7NgxpaWl6ZprrtFPfvKTBm+5+tWvfiWbzaaf//znOnz4sHJzczV+/Hjt3LnTfWWqMRpT25mMMbryyiu1adMm3XDDDRo6dKjefPNN3XPPPfrqq6/0u9/9zmP9f/7zn3rxxRd16623Kjw8XL///e81ffp0ff755+ratWuddX3zzTcaM2aMCgoKlJmZqT59+mj16tWaPXu2iouLdccdd2jgwIF69tlndeedd6pnz5666667JMn9Baqp3nrrLaWlpalv377KycnRN998o8cff1yXXHKJduzYUecgD3v37tXll1+uqKgo5efnKzo6WuXl5Ro9erS++uor3Xzzzerdu7f+9a9/af78+Tp48GCN5ypWrlypkydP6uabb5bNZtPDDz+sadOm6X//+1+9V91eeeUVtW/fXldffXWty/v06aNLL71UGzdu1DfffKMOHTqotLRUo0aN0ieffKLrr79eP/jBD3T06FG9/PLL+vLLLxUdHa2qqipNmTJFGzZs0DXXXKM77rhDJ0+eVH5+vnbt2lUjZDXG6dOnlZqaqksvvVSPPvqowsLC3Ms2btyo559/XpmZmYqOjlZCQoKKiop00UUXuYPReeedp9dff1033HCDSkpKatyetWTJEgUFBenuu+/WiRMn9PDDD+vHP/6x3n//ffc6+fn5mjJlirp376477rhDsbGx+uSTT/Tqq6/qjjvukPTd+XzJJZeoR48eys7OVseOHfX8889r6tSpeuGFF3TVVVc1+b1L0tVXX60+ffrooYce0o4dO/TUU0+pW7du+s1vfuNVey4//elPtX79euXn5+uCCy6Q9N2zi506dVJWVpY6deqkjRs3auHChSopKdEjjzwiSbr//vt14sQJffnll+7ztlOnTpKkkpISPfXUU7r22ms1d+5cnTx5Uv/v//0/paamauvWre5bYvPz83Xttddq3Lhx7vfxySef6N1333Xvz8acC+edd57+9Kc/1bj99MyrtABagQEQUJ5++mkjyWzbtq3OdSIjI833v/999/SiRYvMmR8Xv/vd74wkc+TIkTrb2LZtm5Fknn766RrLRo8ebSSZZcuW1bps9OjR7ulNmzYZSaZHjx6mpKTEPf/55583ksxjjz3mnhcfH28yMjIabLO+2jIyMkx8fLx7es2aNUaS+eUvf+mx3owZM4zNZjMFBQXueZJMaGiox7wPP/zQSDKPP/54jW2dKTc310gyzz33nHveqVOnzMiRI02nTp083nt8fLyZPHlyve2d7ciRI0aSWbRokXve0KFDTbdu3cyxY8c86g0KCjLXXXede56r/48cOWI++eQTExcXZ1JSUszx48fd6zz44IOmY8eO5r///a/HdrOzs01wcLD5/PPPjTHGFBYWGkmma9euHq9fu3atkWReeeWVet9H586dTVJSUr3r3H777UaS+eijj4wxxixcuNBIMi+++GKNdaurq40xxixfvtxIMkuXLq1zHdexuGnTJo/lrvd05vGUkZFhJJns7Owa7UkyQUFB5uOPP/aYf8MNN5ju3bubo0ePesy/5pprTGRkpCkvL/eoY+DAgaaiosK93mOPPWYkmf/85z/GGGNOnz5t+vTpY+Lj483XX39d63syxphx48aZwYMHm2+//dZj+cUXX2zOP//8GvXX9n7OPK5cx8v111/vsd5VV11lunbt2mB7GRkZpmPHjnUu//e//20kmTvvvNM9z7VvznTzzTebsLAwj/c1efJkj/Pb5fTp0x770hhjvv76axMTE+PxPu644w4TERFhTp8+XWd9jT0XajsnAbQubnUDUEOnTp3qHd2tc+fOkr67vcTbgQDsdrvmzJnT6PWvu+46hYeHu6dnzJih7t2767XXXvNq+4312muvKTg4WLfffrvH/LvuukvGGL3++use88ePH+9xdWDIkCGKiIjQ//73vwa3Exsbq2uvvdY9LyQkRLfffrtKS0v1zjvvtMC7+T8HDx7Uzp07NXv2bEVFRXnUO2HChFr3665duzR69GglJCTorbfeUpcuXdzLVq9erVGjRqlLly46evSo+9/48eNVVVWlzZs3e7Q1c+ZMj9e7rrw1tJ9OnjzpcRzUxrW8pKREkvTCCy8oKSmp1isXrls4X3jhBUVHR9c6KEJzhnK/5ZZbap0/evRoj+e0jDF64YUXlJ6eLmOMxz5MTU3ViRMntGPHDo825syZ4/FM3Nn78N///rcKCws1b9489zl79ns6fvy4Nm7cqKuvvlonT550b/PYsWNKTU3VZ599pq+++sqr9/6zn/3MY3rUqFE6duyYu1+85bpKc+Zn1JlXfV3vY9SoUSovL9eePXsabDM4ONi9L6urq3X8+HGdPn1aw4YN89jvnTt3VllZmfLz8+tsq6nnAoC2w61uAGooLS1Vt27d6lw+c+ZMPfXUU7rxxhuVnZ2tcePGadq0aZoxY4aCghr395QePXo0aSCD888/32PaZrOpf//+zXq+pTH279+vuLi4Gl+2Bw4c6F5+pt69e9doo0uXLvr6668b3M75559fY//VtZ3mcrU3YMCAGssGDhyoN998s8bD+Onp6YqJidGbb77p/vLp8tlnn+mjjz6q87a7w4cPe0yfvZ9cIaih/RQeHt7gkOuu5a4+27t3r6ZPn17va/bu3asBAwa06CAe7dq1U8+ePWtd1qdPH4/pI0eOqLi4WE8++aSefPLJWl/T1H3oejZp0KBBddZYUFAgY4wWLFigBQsW1LndHj161NlGXeqrz5sR2VxKS0slyeOc/Pjjj/WLX/xCGzdurBGsTpw40ah2n3nmGf32t7/Vnj17VFlZ6Z5/Zl/deuutev7555WWlqYePXpo4sSJuvrqq3XFFVe412nquQCg7RB8AHj48ssvdeLECY+hkM/WoUMHbd68WZs2bdK6dev0xhtvaNWqVbr88su1fv16BQcHN7idpjyX01h1/WW+qqqqUTW1hLq2Y84aCMEfTZ8+Xc8884z++te/6uabb/ZYVl1drQkTJujee++t9bWuZzFcvN1PAwcO1L///W9VVFTIbrfXus5HH32kkJCQGmG5ueo7vmpjt9vr/EPA2ce/68rpT37yE2VkZNT6mrOf/2iJY8213bvvvlupqam1rlPfZ0F9Wutc2LVrl6T/q6u4uFijR49WRESEHnjgAfXr10/t27fXjh079POf/7xRV6Wfe+45zZ49W1OnTtU999yjbt26KTg4WA899JA7QEpSt27dtHPnTr355pt6/fXX9frrr+vpp5/Wdddd5x6IpKnnAoC2Q/AB4OHZZ5+VpDq/BLkEBQVp3LhxGjdunJYuXapf//rXuv/++7Vp0yaNHz++WbcH1eazzz7zmDbGqKCgwOPLYJcuXVRcXFzjtfv371ffvn3d002pLT4+Xm+99VaNW6xct8/Ex8c3uq2GtvPRRx+purra48tyS2/nzO1J0qefflpj2Z49exQdHV1j6OVHHnlE7dq1cw/cMGvWLPeyfv36qbS0VOPHj2/ROs82ZcoUbdmyRatXr651WO59+/bpH//4h8aPH+8OF/369XN/Wa5Lv3799P7776uy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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Long tail of language\n",
"plt.figure(figsize=(10, 4))\n",
"(dtm_df.sum()/15000*100.0).hist(bins=100)\n",
"plt.yscale('log')\n",
"plt.title('Distribution of Token Occurrence in Dataset')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "beb5a473-31a1-4956-8fae-235b53d9841f",
"metadata": {},
"source": [
"We have had to resort to using a log scale for the y-axis, since the distribution of tokens is so extremely skewed and following a power law. We could use this as a cumulative histogram to inform our cutoff choice of `min_df` for the CountVectorizer if we wanted to reduce memory usage.\n",
"\n",
"As a result of doing the count vectorization, we get \"free\" text analytics - as we can calculate the total number of occurrences of each token by summing the counts for each column row-wise (as we did above). \n",
"\n",
"What are the 10 most frequently occurring tokens in the dataset?"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "470c297b-ec74-4d50-9d6f-bb94a6ed027a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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REREVP0Z/A3PCQkJsLS01HcZREREVEMYfPhxcHDQdwlERERUgxjkZa8nFb3sVdS0adPg4uKC06dPAwAOHz6MDh06wNzcHG5uboiIiEBWVlYVVUtERESGzuDDT2mEEHjzzTfx448/4tChQ2jWrBlSUlLQrVs39O/fH6dPn8bq1atx+PBhTJgwodT15OTkQKvV6jyIiIio5qqW4ScvLw+vvPIKfv31Vxw+fBj169cHAMTExCAsLAyRkZFo0KAB2rVrh3nz5uHHH3/Ew4cPS1xXTEwMbGxspIebm1tVdoWIiIiqmMHf81OSiRMnQqVS4ffff4e9vb00/dSpUzh9+jRWrFghTRNCoKCgAFeuXEHjxo2LrSsqKgqTJk2Snmu1WgYgIiKiGqxahp8XX3wRP//8M3bt2oWwsDBpemZmJsaOHYuIiIhiy7i7u5e4LpVKBZVKVWm1EhERkWGpluHnpZdeQq9evfDyyy/D2NgYQ4YMAQC0bNkS58+fly6DERERERVVLe/5AYC+ffvip59+wsiRI7Fu3ToAwHvvvYfffvsNEyZMQGJiIpKTk7F58+an3vBMRERE8lItz/wUGjBgAAoKCjBs2DAYGRmhX79+OHDgAD744AN06NABQgh4e3tj8ODB+i6ViIiIDIRCCCH0XYQh0Wq1j0d9Ra6BkcpC3+UQEVEFSo0N1XcJVEkK3781Gg3UavVT21bby15ERERE/wbDDxEREclKtb7npzKdjQ4p87QZERERVT8880NERESywvBDREREssLwQ0RERLLC8ENERESywvBDREREssLwQ0RERLLC8ENERESywvBDREREssLwQ0RERLLC8ENERESywvBDREREssLwQ0RERLLC8ENERESywvBDREREssLwQ0RERLLC8ENERESywvBDREREssLwQ0RERLJiou8CDJXftF0wUlnouwwiomojNTZU3yUQPROe+SEiIiJZYfghIiIiWWH4ISIiIlnRW/gRQmDMmDGws7ODQqFAYmJipWwnKCgIkZGRlbJuIiIiqn70dsPzzp07sXTpUsTFxaFevXqwt7fXVylEREQkI3oLPykpKXBxcUG7du30VQIRERHJkF4ue4WHh+PNN99EWloaFAoFPD09kZOTg4iICDg6OsLMzAzt27dHQkKCznIHDhxAmzZtoFKp4OLigilTpiAvL0+an5WVheHDh8PK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vr5LISIiohpMb+EnKCgIkZGR0vN27drh+vXrsLGx0VdJREREJAMGM9pLqVTC2dlZ32UQERFRDaeXMz/h4eE4cOAA5s6dC4VCAYVCgaVLl+pc9lq6dClsbW2xdetW+Pj4wMLCAgMGDEB2djaWLVsGT09P1KpVCxEREcjPz5fWnZOTg3feeQd16tSBpaUl2rZti7i4OH10k4iIiAyQXs78zJ07FxcvXoSfnx9mzJgBADh37lyxdtnZ2Zg3bx5WrVqFjIwM9OvXD3379oWtrS22b9+Oy5cvo3///ggMDMTgwYMBABMmTMD58+exatUquLq6YuPGjejWrRvOnDmDBg0aFNtGTk4OcnJypOdarbaSek1ERESGQC/hx8bGBkqlEhYWFtKlrj///LNYu9zcXCxatAje3t4AgAEDBuCnn37CzZs3YWVlBV9fX3Tu3Bn79+/H4MGDkZaWhiVLliAtLQ2urq4AgHfeeQc7d+7EkiVL8OmnnxbbRkxMDKKjoyuxt0RERGRIDOaen5JYWFhIwQcAnJyc4OnpCSsrK51p6enpAIAzZ84gPz8fDRs21FlPTk4OateuXeI2oqKiMGnSJOm5VquFm5tbRXaDiIiIDIhBhx9TU1Od5wqFosRpBQUFAIDMzEwYGxvj+PHjMDY21mn3ZGB6kkqlgkqlqsCqiYiIyJDpLfwolUqdG5UrQosWLZCfn4/09HR06NChQtdNRERENYPePufH09MTR48eRWpqKm7fvi2dvfkvGjZsiLCwMAwfPhwbNmzAlStX8McffyAmJgbbtm2rgKqJiIioutNb+HnnnXdgbGwMX19fODg4IC0trULWu2TJEgwfPhxvv/02fHx80KdPHyQkJMDd3b1C1k9ERETVm0IIIfRdhCHRarWwsbGBW+QaGKks9F0OEVWA1NhQfZdARJWs8P1bo9FArVY/ta3BfLcXERERUVVg+CEiIiJZMeih7vp0NjqkzNNmREREVP3wzA8RERHJCsMPERERyQrDDxEREckKww8RERHJCsMPERERyQrDDxEREckKww8RERHJCsMPERERyQrDDxEREckKww8RERHJCsMPERERyQrDDxEREckKww8RERHJCsMPERERyQrDDxEREckKww8RERHJCsMPERERyQrDDxEREcmKib4LMFR+03bBSGWh7zKIqIjU2FB9l0BE1RzP/BAREZGs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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dtm_df.sum().nlargest(10).sort_values().plot(kind='barh')\n",
"plt.title('Most frequently occuring tokens in corpus')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "bf473d57-c205-41b9-ad53-cb3e9f3b19e3",
"metadata": {},
"source": [
"That's interesting, but perhaps these tokens are not distributed across the different review types evenly. Let's instead look at the most frequently occurring tokens per source. To do this, we will use a pandas [groupby](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html).\n",
"\n",
"To do this, we need to add the `source` column to the document-term matrix dataframe. We should check if there is already a `source` column (as this could have appeared as a token in the dataset):"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "fc07c845-90af-4fb0-a713-644b242757ed",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 0\n",
"1 0\n",
"2 0\n",
"3 0\n",
"4 0\n",
" ..\n",
"14995 0\n",
"14996 0\n",
"14997 0\n",
"14998 0\n",
"14999 0\n",
"Name: source, Length: 15000, dtype: int64"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# CHECK if there is a source column already in the dataframe\n",
"# as we do not want to overwrite it\n",
"dtm_df['source']"
]
},
{
"cell_type": "markdown",
"id": "67f0d6b7-9a0c-4172-ac79-983824e7711e",
"metadata": {},
"source": [
"Indeed, there is! Perhaps we should use a more unique name like `review_source` - let's just quickly check it's not in the columns either:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "e0233bad-f256-4c99-8cf1-c783847e3b5a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sum(dtm_df.columns == 'review_source')"
]
},
{
"cell_type": "markdown",
"id": "45587ef0-09af-4489-aed2-b497677135fd",
"metadata": {},
"source": [
"It is not. Finally, we check that the row count is the same between the document-term matrix dataframe `dtm_df` and the original dataframe with the `source` column, `df`, to make sure we are okay to append the latter to the former:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "16cc3c2f-3c40-428a-9a0e-0634f9cc99b4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dtm_df.shape[0] == df.shape[0]"
]
},
{
"cell_type": "markdown",
"id": "aec98376-4c8f-4fa9-abe5-000fa76c80de",
"metadata": {},
"source": [
"Ok, we can append the column:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "1f0202cc-bfc2-4f16-9173-74961d85dc1e",
"metadata": {},
"outputs": [],
"source": [
"# Append the source column onto the document term dataframe\n",
"dtm_df['review_source'] = df['source']"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "32dd51f7-575d-4048-adf9-8b9ddc21930e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 yelp\n",
"1 yelp\n",
"2 yelp\n",
"3 yelp\n",
"4 yelp\n",
" ... \n",
"14995 amazon\n",
"14996 amazon\n",
"14997 amazon\n",
"14998 amazon\n",
"14999 amazon\n",
"Name: review_source, Length: 15000, dtype: object"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dtm_df['review_source']"
]
},
{
"cell_type": "markdown",
"id": "504a085e-1505-42c1-9beb-3e819350ae73",
"metadata": {},
"source": [
"Now we can group by review type and with a single line of code in pandas, calculate the total number of occurrences of each token by review type!"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "b2e39bea-95a9-4e66-b0c2-02356bb3b454",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
"review_source amazon rottentomatoes yelp\n",
"0 great film place\n",
"1 tablet movie good\n",
"2 love like food\n",
"3 use story great\n",
"4 easy just like\n",
"5 bought good just\n",
"6 kindle characters time\n",
"7 amazon time service\n",
"8 echo comedy really\n",
"9 good films dont\n",
"10 like way love\n",
"11 alexa funny nice\n",
"12 loves little im\n",
"13 screen bad little\n",
"14 price make ive\n",
"15 just movies best\n",
"16 product makes got\n",
"17 kids life pretty\n",
"18 old director try\n",
"19 music best restaurant\n",
"20 works really ordered\n",
"21 apps love didnt\n",
"22 device doesnt people\n",
"23 books work chicken\n",
"24 games theres menu"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grouped_sum.apply(lambda x: pd.Series(x.nlargest(25).index), axis=1).T"
]
},
{
"cell_type": "markdown",
"id": "4901e44a-299a-4f41-b468-3f9ed5ab4251",
"metadata": {},
"source": [
"We can see that the Amazon reviews are mainly about electronics, RottenTomatoes mostly has movie words, and Yelp reviews mostly food and restaurant words, as would be expected.\n",
"\n",
"Finally, we can pull out the entire rows in the lambda function, transpose the result, and plot:"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "946cb85b-7f6c-47ab-b766-c1a3dd6a95aa",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAvYAAAGdCAYAAAB5OjckAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABOMUlEQVR4nO3deVxUZf//8fewjSCbIC4oggsR7ruht2llYaZptphSLplmRmYuKXe3C2rRZrmUlS2g5dJiLqVZbpCSmSuukaLeULemmc6IJiqc3x/9nG+TaJrA4OH1fDzm8WDOOXOdz3U5MG8ur3OwGIZhCAAAAMB1zc3VBQAAAAC4dgR7AAAAwAQI9gAAAIAJEOwBAAAAEyDYAwAAACZAsAcAAABMgGAPAAAAmADBHgAAADABD1cX4AoFBQX63//+Jz8/P1ksFleXAwAAroBhGDp58qRCQ0Pl5sbcJPBXZTLY/+9//1NYWJirywAAAP9ATk6Oqlev7uoygFKnTAZ7Pz8/SX/8YPD393dxNQAA4ErY7XaFhYU5PscBOCuTwf7C8ht/f3+CPQAA1xmW0QKFY4EaAAAAYAIEewAAAMAECPYAAACACZTJNfYAAAD/lGEYOn/+vPLz811dCkzO3d1dHh4eV3xdCcEeAADgCp09e1aHDh3S6dOnXV0KyggfHx9VrVpVXl5ef3sswR4AAOAKFBQU6MCBA3J3d1doaKi8vLy4Qw+KjWEYOnv2rI4ePaoDBw4oMjLyb/8wG8EeAADgCpw9e1YFBQUKCwuTj4+Pq8tBGeDt7S1PT0/997//1dmzZ1WuXLnLHs/FswAAAFfh72ZNgaJ0Ne833pkAAACACbgk2EdERGjKlClO2xo3bqzx48fLMAyNHz9eNWrUkNVqVWhoqIYMGeI4Li8vTyNGjFC1atVUvnx5tWrVSqmpqSXbAQAAAKCUKXVr7BcsWKDXXntN8+fPV7169XT48GFlZGQ49sfHx2v37t2aP3++QkNDtXDhQnXs2FE7duxQZGRkoW3m5eUpLy/P8dxutxd7PwAAQNkRMXppiZ3r4At3ldi5cH0pdcE+OztbVapUUYcOHeTp6akaNWqoZcuWjn3JycnKzs5WaGioJGnEiBFavny5kpOT9fzzzxfaZlJSkhITE0usDwAAAEBJK3Vr7O+//379/vvvqlWrlgYMGKCFCxfq/PnzkqQdO3YoPz9fN9xwg3x9fR2PtLQ0ZWVlXbLNhIQE2Ww2xyMnJ6ekugMAAACUCJfM2Lu5uckwDKdt586dkySFhYUpMzNTK1eu1IoVKzR48GC9/PLLSktLU25urtzd3bV582a5u7s7vd7X1/eS57NarbJarRdtrz/uK7lZuV0Vigf/VQoAKC2WL1+uSZMmaefOnXJ3d1dMTIymTp2q2rVr6+DBg6pZs6Y++ugjTZ8+XZs2bVL9+vU1Z84c2Ww2Pf744/rhhx/Utm1bzZ49WyEhIZKkjRs36t///re2bt2qc+fOqXHjxnrttdfUtGlTSVJKSor69et3US3jxo3T+PHjVVBQoEmTJmnmzJk6evSooqOj9cILL6hjx46S5KhrwYIFmj59ujZs2KDIyEi99dZbiomJKbnBu464ZMY+JCREhw4dcjy32+06cOCA47m3t7e6dOmiadOmKTU1VevXr9eOHTvUpEkT5efn68iRI6pTp47To0qVKq7oCgAAQKl36tQpDRs2TJs2bdKqVavk5uame+65RwUFBY5jxo0bp//85z/asmWLPDw81KtXLz3zzDOaOnWq1q5dq3379mns2LGO40+ePKk+ffpo3bp1+u677xQZGalOnTrp5MmTkqQePXro0KFDjse8efPk4eGhNm3aSJKmTp2qyZMn65VXXtH27dsVGxuru+++W3v37nWq/dlnn9WIESO0bds23XDDDerZs6djNQecuWTG/tZbb1VKSoq6dOmiwMBAjR071jEDn5KSovz8fLVq1Uo+Pj768MMP5e3trfDwcAUHBysuLk69e/fW5MmT1aRJEx09elSrVq1Sw4YNddddzJACAAD81b333uv0/P3331dISIh2797tWPUwYsQIxcbGSpKeeuop9ezZU6tWrXIE8f79+yslJcXRxq233urU5syZMxUYGKi0tDR17txZ3t7e8vb2liRlZWXpiSee0PPPP6/bb79dkvTKK69o1KhRevDBByVJL774otasWaMpU6bojTfecLQ7YsQIR8ZLTExUvXr1tG/fPt14441FNTym4ZIZ+4SEBLVr106dO3fWXXfdpW7duql27dqSpMDAQL3zzjtq06aNGjZsqJUrV+rzzz9XcHCwJCk5OVm9e/fW8OHDFRUVpW7dumnjxo2qUaOGK7oCAABQ6u3du1c9e/ZUrVq15O/vr4iICEl/3JjkgoYNGzq+rly5siSpQYMGTtuOHDnieP7LL79owIABioyMVEBAgPz9/ZWbm+vUpiTZbDZH5hs5cqSkP1Zr/O9//3P80nBBmzZttGfPHqdtf66ratWqkuRUB/6PS2bs/f39NX/+fKdtffr0cXzdrVu3S77W09NTiYmJ3OUGAADgCnXp0kXh4eF65513FBoaqoKCAtWvX19nz551HOPp6en42mKxFLrtz0t3+vTpo2PHjmnq1KkKDw+X1WpVTEyMU5v5+fnq0aOH/P39NXPmzH9Ue2F1/bkO/J9Sd7vLkrQzMVb+/v6uLgMAAKDYHDt2TJmZmXrnnXfUtm1bSdK6deuuud309HTNmDFDnTp1kiTl5OTo119/dTrm6aef1o4dO7Rp0yaVK1fOsd3f31+hoaFKT09Xu3btnNq8cJtzXL0yHewBAADMrkKFCgoODtbMmTNVtWpVZWdna/To0dfcbmRkpD744AM1b95cdrtdI0eOdKypl/5YPj1jxgwtXLhQFotFhw8fliTH7cpHjhypcePGqXbt2mrcuLGSk5O1bds2zZkz55prK6sI9gAAANeoNN/i2M3NTfPnz9eQIUNUv359RUVFadq0aWrfvv01tfvee+9p4MCBatq0qcLCwvT8889rxIgRjv1paWnKz8/X3Xff7fS6C7e7HDJkiGw2m4YPH64jR46obt26WrJkiSIjI6+prrLMYvz1hvJlgN1uV0BAgGw2G0txAAC4Trj68/vMmTM6cOCAatas6bSsBChOV/O+K3V/eRYAAADA1SPYAwAAACZAsAcAAABMgGAPAAAAmADBHgAAADABgj0AAABgAgR7AAAAwAQI9gAAAIAJEOwBAAAAE/BwdQEAAADXvfEBJXguW4mcpn379mrcuLGmTJni2JaamqpbbrlFx48fV2BgYJGeb/z48Vq0aJG2bdtWpO3+UykpKRo6dKhOnDjh6lKuGDP2AAAAZczZs2ddXQKKAcEeAADA5Nq3b6/4+HgNHTpUFStWVGxsrNLS0tSyZUtZrVZVrVpVo0eP1vnz5yVJffv2VVpamqZOnSqLxSKLxaKDBw/qlltukSRVqFBBFotFffv2lSQVFBQoKSlJNWvWlLe3txo1aqRPP/3Ucf7U1FRZLBatWrVKzZs3l4+Pj1q3bq3MzExJf8yOJyYmKiMjw3G+lJQUSVJ2dra6du0qX19f+fv764EHHtAvv/ziaHv8+PFq3Lix3n//fdWoUUO+vr4aPHiw8vPz9dJLL6lKlSqqVKmSnnvuOacxefXVV9WgQQOVL19eYWFhGjx4sHJzcx319uvXTzabzVHP+PHjJUnHjx9X7969VaFCBfn4+OjOO+/U3r17ndpet26d2rZtK29vb4WFhWnIkCE6deqUY/+MGTMUGRmpcuXKqXLlyrrvvvuu8V/4DyUW7Pv27atu3bpd9pj27dtr6NChJVIPAABAWTJr1ix5eXkpPT1d48ePV6dOndSiRQtlZGTozTff1HvvvadJkyZJkqZOnaqYmBgNGDBAhw4d0qFDhxQWFqYFCxZIkjIzM3Xo0CFNnTpVkpSUlKTZs2frrbfe0q5du/T000/roYceUlpamlMNzz77rCZPnqxNmzbJw8NDjzzyiCSpR48eGj58uOrVq+c4X48ePVRQUKCuXbvqt99+U1pamlasWKH9+/erR48eTu1mZWXpyy+/1PLlyzVv3jy99957uuuuu/TTTz8pLS1NL774ov7zn/9ow4YNjte4ublp2rRp2rVrl2bNmqXVq1frmWeekSS1bt1aU6ZMkb+/v6OeESNGSPoj027atElLlizR+vXrZRiGOnXqpHPnzjlq6dixo+69915t375dH330kdatW6f4+HhJ0qZNmzRkyBBNmDBBmZmZWr58uW6++eYi+Tf+R2vsC1tz5QrX49onAAAAV4iMjNRLL70kSZo9e7bCwsL0+uuvy2Kx6MYbb9T//vc/jRo1SmPHjlVAQIC8vLzk4+OjKlWqONoICgqSJFWqVMmxxj4vL0/PP/+8Vq5cqZiYGElSrVq1tG7dOr399ttq166d4/XPPfec4/no0aN111136cyZM/L29pavr688PDyczrdixQrt2LFDBw4cUFhYmKP2evXqaePGjWrRooWkP/7H4P3335efn5/q1q2rW265RZmZmVq2bJnc3NwUFRWlF198UWvWrFGrVq0kyWkyOSIiQpMmTdKgQYM0Y8YMeXl5KSAgQBaLxamevXv3asmSJUpPT1fr1q0lSXPmzFFYWJgWLVqk+++/X0lJSYqLi3O0HxkZqWnTpqldu3Z68803lZ2drfLly6tz587y8/NTeHi4mjRpcm3/uP8fF88CAACUAc2aNXN8vWfPHsXExMhisTi2tWnTRrm5ufrpp59Uo0aNK2533759On36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oYe0atUqrVu3TnXq1JEkJSUlKS4uTkOHDlVkZKRat26tadOmafbs2Tpz5kyhbSUlJSkgIMDxCAsLK8muAAAAAMWuVCzFKczTTz8tq9Wq7777ThUrVnRsz8jI0Pbt2zVnzhzHNsMwVFBQoAMHDig6OvqithISEjRs2DDHc7vdTrgHAACAqZTaYH/77bdr3rx5+uqrrxQXF+fYnpubq8cee0xDhgy56DU1atQotC2r1Sqr1VpstQIAAACuVmqD/d13360uXbqoV69ecnd314MPPihJatq0qXbv3u1YmnNNEn6S/P2vvR0AAADAxUrtGntJuueee/TBBx+oX79++vTTTyVJo0aN0rfffqv4+Hht27ZNe/fu1eLFiy978SwAAABgdqV2xv6C++67TwUFBXr44Yfl5uam7t27Ky0tTc8++6zatm0rwzBUu3Zt9ejRw9WlAgAAAC5jMQzDcHURJc1utysgIEA2m03+LMUBAOC6wOc3cHmleikOAAAAgCtDsAcAAABMgGAPAAAAmADBHgAAADABgj0AAABgAgR7AAAAwAQI9gAAAIAJEOwBAAAAEyDYAwAAACZAsAcAAABMgGAPAAAAmADBHgAAADABgj0AAABgAgR7AAAAwAQI9gAAAIAJEOwBAAAAEyDYAwAAACbgkmDft29fdevWzRWnBgAAAEzJJcF+6tSpSklJKZK2IiIiNGXKlCJpCwAAALheebjipAEBAa44LQAAAGBaFsMwjJI+ad++fXXixAktWrRIERERGjp0qIYOHerY37hxY3Xr1k3jx4+XYRhKTEzU+++/r19++UXBwcG67777NG3aNLVv315paWlObV9Jd+x2uwICAmQb7Sd/q6Wou3d5420lez4AAEzC8flts8nf39/V5QCljktm7K/GggUL9Nprr2n+/PmqV6+eDh8+rIyMDEnSZ599pkaNGmngwIEaMGDAJdvIy8tTXl6e47ndbi/2ugEAAICSVOqDfXZ2tqpUqaIOHTrI09NTNWrUUMuWLSVJQUFBcnd3l5+fn6pUqXLJNpKSkpSYmFhSJQMAAAAlrtTf7vL+++/X77//rlq1amnAgAFauHChzp8/f1VtJCQkyGazOR45OTnFVC0AAADgGi6fsXdzc7toXfy5c+ccX4eFhSkzM1MrV67UihUrNHjwYL388stKS0uTp6fnFZ3DarXKarVevCPhJ4k1egAAADABl8/Yh4SE6NChQ47ndrtdBw4ccDrG29tbXbp00bRp05Samqr169drx44dkiQvLy/l5+eXaM0AAABAaePyGftbb71VKSkp6tKliwIDAzV27Fi5u7s79qekpCg/P1+tWrWSj4+PPvzwQ3l7eys8PFzSH/ex/+abb/Tggw/KarWqYsWKruoKAAAA4DIun7FPSEhQu3bt1LlzZ911113q1q2bateu7dgfGBiod955R23atFHDhg21cuVKff755woODpYkTZgwQQcPHlTt2rUVEhLiqm4AAAAALuWS+9j37NlT7u7u+vDDD0v61JK4Dy4AANcjPr+ByyvRGfvz589r9+7dWr9+verVq1eSpwYAAABMrUSD/c6dO9W8eXPVq1dPgwYNKslTAwAAAKZWohfPNm7cWKdPny7JUwIAAABlgssvngUAAABw7Qj2AAAAgAkQ7AEAAAATINgDAAAAJkCwBwAAAEyAYA8AAACYAMEeAAAAMAGCPQAAAGACBHsAAADABAj2AAAAgAkQ7AEAAAAT8HB1Aa5009yb5O7t7uoyAABXYEefHa4uAQBKNWbsAQAAABMg2AMAAAAmcF0H+9TUVFksFp04ccLVpQAAAAAu5ZJgf/bsWVecFgAAADAti2EYxrU2cvLkSQ0aNEiLFi2Sv7+/nnnmGS1evFiNGzfWlClTFBERof79+2vv3r1atGiRunfvrpSUFK1bt04JCQnatGmTKlasqHvuuUdJSUkqX768JOmDDz7Q1KlTlZmZqfLly+vWW2/VlClTVKlSJR08eFA1a9Z0qqNPnz5KSUn523rtdrsCAgJks9nk7+9/rd0HAAAlgM9v4PKKZMZ+2LBhSk9P15IlS7RixQqtXbtWW7ZscTrmlVdeUaNGjbR161aNGTNGWVlZ6tixo+69915t375dH330kdatW6f4+HjHa86dO6eJEycqIyNDixYt0sGDB9W3b19JUlhYmBYsWCBJyszM1KFDhzR16tRC68vLy5Pdbnd6AAAAAGZyzTP2J0+eVHBwsObOnav77rtPkmSz2RQaGqoBAwY4ZuybNGmihQsXOl736KOPyt3dXW+//bZj27p169SuXTudOnVK5cqVu+hcmzZtUosWLXTy5En5+voqNTVVt9xyi44fP67AwMBL1jh+/HglJiZetJ3f+AEAuH4wYw9c3jXP2O/fv1/n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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"grouped_sum.apply(lambda x: pd.Series(x.nlargest(5)), axis=1).T.plot(kind='barh')\n",
"plt.legend(bbox_to_anchor=(1.05, 1.0), loc='upper left')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "a5c7b4a1-f0b8-4f79-b9a2-076d9988e770",
"metadata": {},
"source": [
"We can see some words only occur frequently in a single category, whereas some others are frequently occurring in multiple review types (*e.g.* 'great', 'like').\n",
"\n",
"Now we will drop t he review source column from our document-term matrix dataframe as we will be proceeding to doing machine learning and it is no longer required:"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "2a9e8bdb-551a-4d27-b885-fa79e7f4957d",
"metadata": {},
"outputs": [],
"source": [
"# Drop source from dtm_df\n",
"dtm_df.drop('review_source', axis=1, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "d4e8476a-215e-4996-ba65-9321b6ee630f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check\n",
"'review_source' in dtm_df.columns"
]
},
{
"cell_type": "markdown",
"id": "8ecadfe8-4510-42ad-96f3-8ebf16f018c9",
"metadata": {},
"source": [
"### Preprocessing the target column (`review`)\n",
"\n",
"Now that we have preprocessed the reviews into numeric features for machine learning, we must also adddress the target column, `source`. Here we have a single column with values 'yelp', 'amazon', 'rottentomatoes' - we would like these to be integer values to represent categorical buckets (classes) for supervised learning - using a classification model."
]
},
{
"cell_type": "markdown",
"id": "1b3e695d-c6c8-4eff-b085-0c85a52e9ab8",
"metadata": {},
"source": [
"One way to do this is using the `map` method from pandas and providing a dictionary to map the distinct values in the column to corresponding integer values:"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "774a39a8-6398-4d1a-9268-965dd7684794",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 0\n",
"1 0\n",
"2 0\n",
"3 0\n",
"4 0\n",
" ..\n",
"14995 2\n",
"14996 2\n",
"14997 2\n",
"14998 2\n",
"14999 2\n",
"Name: source, Length: 15000, dtype: int64"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Method 1 - using pd.Series.map\n",
"df['source'].map({'yelp':0, 'rottentomatoes':1, 'amazon':2})"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "2121691a-db8b-45f6-b86a-6789d455fb96",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"source\n",
"0 5000\n",
"1 5000\n",
"2 5000\n",
"Name: count, dtype: int64"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check\n",
"df['source'].map({'yelp':0, 'rottentomatoes':1, 'amazon':2}).value_counts()"
]
},
{
"cell_type": "markdown",
"id": "29552c0a-cfeb-438c-8781-9bbeb908190f",
"metadata": {},
"source": [
"This is fine, because we know the distinct values which appear in our target column, and the number of distinct values (*i.e.* the cardinality of the target) is low (3). What if we don't know all the different values and/or there are a very large number of categories (*i.e.* the target has very high cardinality)? Here using the `map` function would be difficult or perhaps not possible.\n",
"\n",
"Instead, this would be a case where we would use the `LabelEncoder` from scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html\n",
"\n",
"As with other 'transformer' type classes in sklearn, we instantiate and then call `fit_transform`:"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "c6612db6-f20d-4a72-a39c-af9824267aaf",
"metadata": {},
"outputs": [],
"source": [
"# import\n",
"from sklearn.preprocessing import LabelEncoder\n",
"\n",
"# instantiate\n",
"le = LabelEncoder()\n",
"\n",
"# fit-transform\n",
"y = pd.Series(le.fit_transform(df['source']))"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "0ebc719e-62ce-418e-8d5c-cf23d9fb26dc",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 2\n",
"1 2\n",
"2 2\n",
"3 2\n",
"4 2\n",
" ..\n",
"14995 0\n",
"14996 0\n",
"14997 0\n",
"14998 0\n",
"14999 0\n",
"Length: 15000, dtype: int32"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check\n",
"y"
]
},
{
"cell_type": "markdown",
"id": "7b938d20-0a9b-4992-9d72-21f2c9b95a1a",
"metadata": {},
"source": [
"The distinct classes found in the target column are stored in the `.classes_` attribute in the LabelEncoder:"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "731dd1d0-d3a5-451d-98e2-e1e5c1a5a77c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['amazon', 'rottentomatoes', 'yelp'], dtype=object)"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"le.classes_"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "dad87c01-e4cd-4f23-85f8-762ff4d7c809",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2 5000\n",
"1 5000\n",
"0 5000\n",
"Name: count, dtype: int64"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check\n",
"y.value_counts()"
]
},
{
"cell_type": "markdown",
"id": "ed492e06-1672-4bba-ad43-3e91d69c3536",
"metadata": {},
"source": [
"## Machine Learning\n",
"\n",
"Now that we've completed all the preprocessing we can move forward into the machine learning piece of the case study to build our MVP model. We have already created our target feature, `y`, above, and the document-term matrix dataframe will serve as our input features, `X`:"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "7596c003-c814-4b33-b8d0-678741d2ce27",
"metadata": {},
"outputs": [],
"source": [
"# Training data\n",
"X = dtm_df\n",
"\n",
"# If on Colab Free or low resource machine, uncomment below\n",
"# Use original sparse document-term matrix for training\n",
"# X = dtm\n",
"\n",
"# y is already assigned"
]
},
{
"cell_type": "markdown",
"id": "1a1cb1b4-384b-4b71-a071-411588b96515",
"metadata": {},
"source": [
"Next, we split our data into training and test sets. Note that this is a naive approach, and more in-depth approaches such as [cross-validation](https://en.wikipedia.org/wiki/Cross-validation_(statistics)) should be used, however this is fine for our MVP. Because we have a sizeable number of observations (15K), we can use a smaller test size - we choose 13.3% so that our train and test sets shake out to round numbers evenly:"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "93720653-f610-48cb-a830-c60be55cdd89",
"metadata": {},
"outputs": [],
"source": [
"# Train test split\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1333333)"
]
},
{
"cell_type": "markdown",
"id": "a483f671-43e6-47f8-a005-7c601a895d00",
"metadata": {},
"source": [
"Let's check the train and test set sizes:"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "9d842aff-d48d-4e39-be11-d9956b88bdf6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(13000, 33715)"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check\n",
"X_train.shape"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "d66362d8-7fa8-485d-b0bb-de4c8211dc4d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2000, 33715)"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_test.shape"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "b862e5a6-8cce-4adf-8f28-490e5a79cdc7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"438,295,000\n"
]
}
],
"source": [
"print(f'{X_train.shape[0]*X_train.shape[1]:,}')"
]
},
{
"cell_type": "markdown",
"id": "6d1827f1-4014-424f-bf49-a5aeaa89b57f",
"metadata": {},
"source": [
"We have 13K reviews in the training set, and 2K in test. There are a total of ~438M elements in the training data! How large is the training data array in memory?"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "77e39ea4-ae7a-49e6-a566-afd4b6aa4183",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3.2656491100788116"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sys\n",
"\n",
"# Size of data in GB\n",
"sys.getsizeof(X_train)/(1024**3)"
]
},
{
"cell_type": "markdown",
"id": "6a0e208c-875c-4fa8-81f7-7c4c9ddf7d03",
"metadata": {},
"source": [
"The training data is ~3.3 GB! This may be challenging for lower-end machines or environments such as Google Colab free. Nonetheless, we press forward and fit our v0 model - the actual machine learning piece is very straightforward with only 3-4 lines of code, as we saw in [Section 3 of the course](https://nlpfor.me):"
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "03f93872-ba33-49f5-ba66-e54b5047f3a9",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
LogisticRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
LogisticRegression()
"
],
"text/plain": [
"LogisticRegression()"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# ML\n",
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"# 1. Instantiate\n",
"logreg = LogisticRegression()\n",
"\n",
"# 2. Fit\n",
"logreg.fit(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"id": "baf10261-710d-4df9-abce-23ed81308ba4",
"metadata": {},
"source": [
"We have fit a very simple 'vanilla' Logistic Regression model. Let's check for overfitting by evaluating on the training and test sets:"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "22adbc54-25f3-464b-9046-4b55df030edb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.9966923076923077\n",
"0.972\n"
]
}
],
"source": [
"# 3. Evaluate\n",
"print(logreg.score(X_train, y_train))\n",
"print(logreg.score(X_test, y_test))"
]
},
{
"cell_type": "markdown",
"id": "1f0cbe3a-5242-45d4-bfdc-ea1b61fe1615",
"metadata": {},
"source": [
"While the training score is higher as to be expected, there is not a significant delta between train and test, so there is not extreme overfitting occurring which is good 👍"
]
},
{
"cell_type": "markdown",
"id": "2528919a-bffe-44b2-b0e3-1784305dfea4",
"metadata": {},
"source": [
"## Testing Our Model"
]
},
{
"cell_type": "markdown",
"id": "b47d9517-fbaf-4aff-8017-261e1bfdc5d6",
"metadata": {},
"source": [
"Now that we have fit our MVP model, we can test on some new data from reviews which appeared on the website to \"smoke test\" and see if it performs as expected. Here is a sample of three reviews, in the restaurant, movie, and retail categories:"
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "969a8a0f-5a1b-4309-93ee-db21c4895a66",
"metadata": {},
"outputs": [],
"source": [
"new_data = ['Absolutely loved this place! Would recommend!', \\\n",
" 'Complete trash... avoid this film at all costs, I hate this director', \\\n",
" 'Garbage product, screen did not power on, was a greasy film on the back immediately after I bought it. Will be returning it.']"
]
},
{
"cell_type": "markdown",
"id": "37b4804d-4e11-4460-aaf6-110b0d391f4e",
"metadata": {},
"source": [
"We need to put this data through the same preprocessing as our training data to fit it into the model - *i.e.* clean / normalize, tokenize, remove stopwords, vectorize, etc.\n",
"\n",
"Fortunately for us, we wrote a reusable function to do the former - so this is now just a simple function call passing in the data as a pandas Series:\n"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "83062eef-6567-4101-a36f-ac0c79eadd1c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 absolutely loved this place would recommend\n",
"1 complete trash avoid this film at all costs i ...\n",
"2 garbage product screen did not power on was a ...\n",
"dtype: object"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create a pandas series\n",
"new_reviews = pd.Series(new_data)\n",
"\n",
"# Test review function\n",
"new_reviews = preprocess_text(new_reviews)\n",
"\n",
"new_reviews"
]
},
{
"cell_type": "markdown",
"id": "1b67c1a5-a47b-47fa-bd39-7cb185a5eff3",
"metadata": {},
"source": [
"Great. Now we need to count vectorize the processed data using the originally fit count vectorizer, as our model expects numeric input with the 33,715 tokens (features) as from the original training data:"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "63a8c805-5569-4d8a-97ca-ab5932df53be",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
00
\n",
"
007
\n",
"
01
\n",
"
01042012
\n",
"
03342
\n",
"
039
\n",
"
050
\n",
"
06
\n",
"
07092008
\n",
"
075
\n",
"
...
\n",
"
äúshow
\n",
"
äúskills
\n",
"
äústar
\n",
"
äúthings
\n",
"
école
\n",
"
ém
\n",
"
ótimo
\n",
"
ôºå
\n",
"
única
\n",
"
único
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
...
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
\n",
"
\n",
"
1
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
...
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
\n",
"
\n",
"
2
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
...
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
\n",
" \n",
"
\n",
"
3 rows × 33715 columns
\n",
"
"
],
"text/plain": [
" 00 007 01 01042012 03342 039 050 06 07092008 075 ... äúshow \\\n",
"0 0 0 0 0 0 0 0 0 0 0 ... 0 \n",
"1 0 0 0 0 0 0 0 0 0 0 ... 0 \n",
"2 0 0 0 0 0 0 0 0 0 0 ... 0 \n",
"\n",
" äúskills äústar äúthings école ém ótimo ôºå única único \n",
"0 0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 0 0 \n",
"\n",
"[3 rows x 33715 columns]"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Count vectorize - CV has already been fit\n",
"new_dtm = pd.DataFrame(cv.transform(new_reviews).toarray(), columns=cv.get_feature_names_out())\n",
"\n",
"new_dtm"
]
},
{
"cell_type": "markdown",
"id": "5bb02819-eaf1-4a33-aec7-54b18f474436",
"metadata": {},
"source": [
"Great! Now we can make predictions. The model returns the class labels (0,1,2) and we can convert these back to the text representations using the `inverse_transform` method in the LabelEncoder:"
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "89460e39-919b-46e1-845e-c527523de448",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['yelp', 'rottentomatoes', 'amazon'], dtype=object)"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# So no we have the data in dtm form\n",
"# Get class labels and apply inverse transform to get ORIGINAL labels\n",
"le.inverse_transform(logreg.predict(new_dtm))"
]
},
{
"cell_type": "markdown",
"id": "72c4ba3c-6c9f-4dab-b49a-b9b318347475",
"metadata": {},
"source": [
"It seems to be working well, as it has predicted the categories we expected. We can look in more detail at the model probabilities predicted by using `predict_proba` instead of `.predict`:"
]
},
{
"cell_type": "code",
"execution_count": 69,
"id": "72f00094-d275-4681-9fee-0b24a8ace99b",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
amazon
\n",
"
rottentomatoes
\n",
"
yelp
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0.111143
\n",
"
0.028364
\n",
"
0.860493
\n",
"
\n",
"
\n",
"
1
\n",
"
0.000286
\n",
"
0.999051
\n",
"
0.000663
\n",
"
\n",
"
\n",
"
2
\n",
"
0.878006
\n",
"
0.121334
\n",
"
0.000660
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" amazon rottentomatoes yelp\n",
"0 0.111143 0.028364 0.860493\n",
"1 0.000286 0.999051 0.000663\n",
"2 0.878006 0.121334 0.000660"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame(logreg.predict_proba(new_dtm), columns=le.classes_)"
]
},
{
"cell_type": "markdown",
"id": "3ad791fe-2ec1-4fc2-9aba-01cb752d018c",
"metadata": {},
"source": [
"We can see that the model is extremely confident (~99.9%) that the second review is a movie review, but less confident in the predictions of reviews 1 & 3. Likely there is some ambiguity in review #3, as words like 'film' and 'screen' would also appear in movie reviews."
]
},
{
"cell_type": "markdown",
"id": "9530fc04-ceb4-43ba-b5cb-6e3f32b54beb",
"metadata": {},
"source": [
"## Model introspection\n",
"\n",
"Finally, we can perform model introspection to look at what the model has learned. For Logistic Regression, this means looking at the relative sizes and signs of the coefficients as they related to the different tokens which are predictive of each class.\n",
"\n",
"Since we had 3 classes and 33,715 features, the coffiecients array stored in `.coef_` in the fitted Logistic Regression model has these dimensions. We can nicely put this into a pandas dataframe using the labels from the CountVectorizer and LabelEncoder to make clear:"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "f21150d7-7648-45ad-a031-b4efecd3f219",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
amazon
\n",
"
rottentomatoes
\n",
"
yelp
\n",
"
\n",
" \n",
" \n",
"
\n",
"
00
\n",
"
-0.000958
\n",
"
-0.000332
\n",
"
0.001290
\n",
"
\n",
"
\n",
"
007
\n",
"
-0.010189
\n",
"
0.023619
\n",
"
-0.013430
\n",
"
\n",
"
\n",
"
01
\n",
"
0.000004
\n",
"
0.000005
\n",
"
-0.000009
\n",
"
\n",
"
\n",
"
01042012
\n",
"
-0.000501
\n",
"
-0.000036
\n",
"
0.000537
\n",
"
\n",
"
\n",
"
03342
\n",
"
0.000005
\n",
"
0.000005
\n",
"
-0.000010
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
ém
\n",
"
0.000001
\n",
"
0.000004
\n",
"
-0.000005
\n",
"
\n",
"
\n",
"
ótimo
\n",
"
-0.009188
\n",
"
0.013575
\n",
"
-0.004387
\n",
"
\n",
"
\n",
"
ôºå
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
única
\n",
"
-0.016219
\n",
"
0.023045
\n",
"
-0.006827
\n",
"
\n",
"
\n",
"
único
\n",
"
-0.007613
\n",
"
0.018862
\n",
"
-0.011249
\n",
"
\n",
" \n",
"
\n",
"
33715 rows × 3 columns
\n",
"
"
],
"text/plain": [
" amazon rottentomatoes yelp\n",
"00 -0.000958 -0.000332 0.001290\n",
"007 -0.010189 0.023619 -0.013430\n",
"01 0.000004 0.000005 -0.000009\n",
"01042012 -0.000501 -0.000036 0.000537\n",
"03342 0.000005 0.000005 -0.000010\n",
"... ... ... ...\n",
"ém 0.000001 0.000004 -0.000005\n",
"ótimo -0.009188 0.013575 -0.004387\n",
"ôºå 0.000000 0.000000 0.000000\n",
"única -0.016219 0.023045 -0.006827\n",
"único -0.007613 0.018862 -0.011249\n",
"\n",
"[33715 rows x 3 columns]"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"coef_df = pd.DataFrame(logreg.coef_.T, columns=le.classes_, index=cv.get_feature_names_out())\n",
"coef_df"
]
},
{
"cell_type": "markdown",
"id": "f55f5827-13a8-47b8-ad53-393b747fbad6",
"metadata": {},
"source": [
"We can then visualize this with some matplotlib code to see which tokens are most predictive of each class:"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "514b4daa-40cc-49b1-871e-d7370b1512c7",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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t5mZGaKjoys6DCKir15wcDCCg4MrOgwiIiKiKqHKFN2VRUYg74EiIiovzKlEROWHOZWocqoyw8uJiIiIiIiIqhoW3UREREREREQywqKbiIiIiIiISEZYdBMRERERERHJCItuIiIiIiIiIhlh0U1EREREREQkIyy6iYiIiIiIiGSERTcRERERERGRjLDoJiIiIiIiIpIRFt1EREREREREMsKim4iIiIiIiEhGWHQTERERERERyQiLbiIiIiIiIiIZYdFNREREREREJCMsuomIiIiIiIhkhEU3ERERERERkYyw6CYiIiIiIiKSERbdRERERERERDLCopuIiIiIiIhIRhQqOoCqRjtUG1Cp6CioKhCChIoOgajSY06tvJjDiKoe5tTKjXn168WebiIiIiIiIiIZYdFNREREREREJCMsuomIiIiIiIhkhEU3ERF9kI+PD7p3717RYRARERFVOSy6iYiIiIhKiV9CElFZsegmIiIiIvrMcnJyKjoEIvpMylx0Hzx4EG3atIGOjg709PTg5uaGpKQkAEBycjIkEgm2bt2Ktm3bQlVVFc2aNcPNmzdx/vx5NG3aFBoaGujSpQsePXokbvP8+fP45ptvoK+vD21tbTg5OeHixYvi8g0bNkAikRT6BAcHAwDy8/Mxffp01KhRA8rKynBwcMDBgwfF9Qvi2rlzJ9q3bw81NTU0bNgQp0+f/tjzRkRULvLz8zFv3jzUqVMHysrKqFmzJmbNmgUAiIuLQ4cOHaCqqgo9PT0MGTIEWVlZ4roFvS2zZ8+GkZERdHR0MH36dOTm5iIgIAC6urqoUaMGwsLCpPZ579499OnTBzo6OtDV1cV3332H5ORkcXleXh7Gjh0r5vkJEyZAEP7vNSe///479PT0kJ2dLbXd7t27Y8CAATI4S0REn9/27dthb28v5uCOHTsiICAA4eHh2LNnj3g9GhUVBaD0OXvWrFkwNTWFjY0NgA/nZCKq+spcdL948QJjx45FTEwMjh07Bjk5OfTo0QP5+flim6CgIEyZMgUXL16EgoIC+vfvjwkTJmDJkiU4efIkbt26hWnTpontnz9/Dm9vb5w6dQpnzpyBlZUVunbtiufPnwMA+vbti9TUVPHz559/QkFBAa1btwYALFmyBAsWLMAvv/yCK1euwNXVFd9++y0SExOlYp88eTLGjx+P2NhYWFtbw8PD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oDIyMmx1jB8/XpI0e/ZsBQYGytXVVT4+PnrssceKa/UBoNiEhYXpueeeU3R0tKpUqSIfHx/NmzdPFy9e1MCBA+Xh4aH69evriy++sL1m8+bNCgkJkYuLi3x9fTV69Gj98ccfkqS5c+eqZs2aysnJyfU5PXv21NNPPy0p79PL33nnHTVs2FCurq665557NHv2bNtzV65cUVRUlHx9feXq6qq6desqLi7OpC0CAI7hjz/+UFRUlKxWq7y8vDR27FgZxrWfjlq8eLHuvfdeeXh4qEaNGnryySd15swZ22sTExNlsVj0xRdfqFWrVnJxcdGWLVvstSoAilGxNd0JCQkKDQ3VoEGDdPLkSZ08eVK1a9dW7dq1tWLFCh04cEDjxo3TK6+8ouXLl+d67YYNG3Tw4EElJibqgw8+0EcffaQJEybc8rOioqKUnJysZcuW6bvvvtPjjz+url276siRI2rXrp3efPNNeXp62uqIiYnRzp079fzzz2vixIk6fPiw1q5dq/vvv7+4Vh8AitXChQvl5eWl7du367nnntOzzz6rxx9/XO3atVNKSooefPBB9evXT5cuXdLPP/+shx56SK1bt9bevXv11ltv6d1339Vrr70mSXr88cd19uxZbdq0yfb+v/32m9auXau+ffvm+flLly7VuHHj9M9//lMHDx7U5MmTNXbsWC1cuFCSNGPGDH366adavny5Dh8+rKVLl8rf39/07QIApdnChQtVvnx5bd++XQkJCZo+fbreeecdSdLVq1c1adIk7d27Vx9//LGOHz+uiIiIm95j9OjRmjJlig4ePKhmzZqV8BoAMEOxna9itVrl7OysihUrqkaNGrb5NzbPAQEBSk5O1vLly9W7d2/bfGdnZ7333nuqWLGiGjdurIkTJ2rUqFGaNGmSypXL/b1Aenq65s+fr/T0dNWsWVPStWsR165dq/nz52vy5MmyWq2yWCy56khPT1elSpXUvXt3eXh4qG7dumrRosUt1ycrK0tZWVm26fPnzxd94wBAIQUHB+vVV1+VJI0ZM0ZTpkyRl5eXBg0aJEkaN26c3nrrLX333Xf67LPP5Ofnp3//+9+yWCy655579Msvv+jll1/WuHHjVKVKFf3973/X+++/rwceeECS9OGHH8rLy0sdO3bM8/NjY2M1bdo0PfLII5Ku5feBAwc0Z84cDRgwQOnp6QoMDNR9990ni8WiunXr5rs+ZCqAu4Gfn5/i4+NlsVgUFBSk1NRUxcfHa9CgQbYziySpXr16mjFjhlq3bq3MzMxcl/dMnDhRnTt3zvdzyFTAsZh+9/JZs2apVatW8vb2lru7u+bOnav09PRcywQHB6tixYq26dDQUGVmZurEiRM3vV9qaqqys7PVoEED2zWI7u7u2rx5s9LS0m5ZR+fOnVW3bl3Vq1dP/fr109KlS3Xp0qVbLh8XFyer1Wp7+Pn5FWHtAaBobjy64eTkpGrVqqlp06a2eT4+PpKkM2fO6ODBgwoNDZXFYrE93759e2VmZuqnn36SJPXt21crV660DdKWLl2qJ5544qYvNiXp4sWLtsuDbszZ1157zZazERER2rNnj4KCgvT8889r/fr1+a4PmQrgbtC2bdtcWRwaGqojR44oOztbu3btUo8ePVSnTh15eHioQ4cOknTTuPjee++97eeQqYBjMbXpXrZsmWJiYhQZGan169drz549GjhwYL7Xa99OZmamnJyctGvXLu3Zs8f2OHjw4C2vF5ckDw8PpaSk6IMPPpCvr6/GjRun4OBg/e9//8tz+TFjxigjI8P2yOsLAAAwS4UKFXJNWyyWXPOuD+r+fJ32rfTo0UOGYWj16tU6ceKEvvnmm1ueWp6ZmSlJmjdvXq6c3bdvn7Zu3SpJatmypX744QdNmjRJly9fVu/evfO9TwaZCuBu9vvvv6tLly7y9PTU0qVLtWPHDq1atUqSbhoXV6pU6bbvR6YCjqVYb4fo7Oys7Oxs23RSUpLatWunYcOG2ebldTR67969unz5stzc3CRJW7dulbu7e57f2rVo0ULZ2dk6c+aM/vrXvxaojuvKly+vTp06qVOnToqNjVXlypW1ceNG2+mTN3JxcZGLi8vtVxoA7Kxhw4ZauXKlDMOwNeNJSUny8PBQ7dq1JUmurq565JFHtHTpUh09elRBQUFq2bJlnu/n4+OjmjVr6tixY7dszCXJ09NT4eHhCg8P12OPPaauXbvqt99+U9WqVW9alkwFcDfYtm1brumtW7cqMDBQhw4d0tmzZzVlyhTb+Hbnzp1F/hwyFXAsxdp0+/v7a9u2bTp+/Ljc3d0VGBioRYsWad26dQoICNDixYu1Y8cOBQQE5HrdlStXFBkZqVdffVXHjx9XbGysoqKi8jztsUGDBurbt6/69++vadOmqUWLFvrvf/+rDRs2qFmzZurWrZv8/f2VmZmpDRs22E5d37hxo44dO6b7779fVapU0Zo1a5STk6OgoKDi3AQAUOKGDRumN998U88995yioqJ0+PBhxcbGauTIkblytG/fvurevbv279+vp556Kt/3nDBhgp5//nlZrVZ17dpVWVlZ2rlzp86dO6eRI0dq+vTp8vX1VYsWLVSuXDmtWLFCNWrUUOXKlU1eWwAovdLT0zVy5EgNGTJEKSkpmjlzpqZNm6Y6derI2dlZM2fO1NChQ7Vv3z5NmjTJ3uUCKCHF2nTHxMRowIABatSokS5fvqxDhw5p9+7dCg8Pl8ViUZ8+fTRs2LBcP3MjSQ888IACAwN1//33KysrS3369LH9zFde5s+fr9dee00vvviifv75Z3l5ealt27bq3r27JKldu3YaOnSowsPDdfbsWcXGxqpTp0766KOPNH78eP3+++8KDAzUBx98oMaNGxfnJgCAElerVi2tWbNGo0aNUnBwsKpWrWr7IvNGf/vb31S1alUdPnxYTz75ZL7v+cwzz6hixYp64403NGrUKFWqVElNmzZVdHS0pGuX7PzrX//SkSNH5OTkpNatW2vNmjV5flkKAHeL/v376/LlywoJCZGTk5NGjBihwYMHy2KxaMGCBXrllVc0Y8YMtWzZUlOnTtXDDz9s75IBlACLcf3HA5Gv8+fPy2q1SqMludq7GtibEctuU5Ku738ZGRny9PS0dzkoBmSqfZFhdy/ytGwiU0sfcvbuUNBM5ZAEAAAAAAAmoekGAAAAAMAkNN0AAAAAAJikWG+kdjfIGMM1UABQXMhUACg+ZCpQOnGkGwAAAAAAk9B0AwAAAABgEppuAAAAAABMQtMNAAAAAIBJaLoBAAAAADAJTTcAAAAAACah6QYAAAAAwCQ03QAAAAAAmISmGwAAAAAAk9B0AwAAAABgEppuAAAAAABMQtMNAAAAAIBJaLoBAAAAADAJTTcAAAAAACah6QYAAAAAwCQ03QAAAAAAmISmGwAAAAAAk9B0AwAAAABgEppuAAAAAABMUt7eBTgaa5xVcrV3FShpRqxh7xKAMolMLRlkGHB3IFNLBzIXf8aRbgAAAAAATELTDQAAAACASWi6AQAAAAAwSZlruv39/fXmm2/apk+dOqXOnTurUqVKqly5st3qAgBHFRERoV69etm7DAAoNf483gSA/JS5G6nt2LFDlSpVsk3Hx8fr5MmT2rNnj6xWqxITE9WxY0edO3eOJhzAXScsLEzNmzdnsAgAd+DP400AyE+ZO9Lt7e2tihUr2qbT0tLUqlUrBQYGqnr16nasDAAAAGXBn8ebAJAfh2u6L1y4oL59+6pSpUry9fVVfHy8wsLCFB0dLSn36T7+/v5auXKlFi1aJIvFooiICHXs2FGSVKVKFds8ALgbREREaPPmzUpISJDFYpHFYlFaWpoiIyMVEBAgNzc3BQUFKSEhId/3ycnJUVxcnO01wcHB+vDDD0toLQDAfGFhYYqKilJUVJSsVqu8vLw0duxYGca1n4K6cby5YMECW6be+Bg/frwk5fmcv7+/JCk7O7vQGQzA8Tjc6eUjR45UUlKSPv30U/n4+GjcuHFKSUlR8+bNb1p2x44d6t+/vzw9PZWQkCA3Nzc9/PDDevTRR3X48GF5enrKzc2t5FcCAOwgISFB33//vZo0aaKJEydKuvYFZO3atbVixQpVq1ZN3377rQYPHixfX1/17t07z/eJi4vTkiVL9PbbbyswMFBff/21nnrqKXl7e6tDhw4luUoAYJqFCxcqMjJS27dv186dOzV48GDVqVNHgwYNyrVceHi4unbtaptOTExUv3791L59e0nSyZMnbc9dvHhRXbt2VWhoqKRrX2IWNoMBOB6HarovXLighQsX6v3339cDDzwgSZo/f75q1qyZ5/Le3t5ycXGRm5ubatSoIUmqWrWqJKl69er5XtOdlZWlrKws2/T58+eLaS0AwD6sVqucnZ1VsWJFWyZK0oQJE2x/DggIUHJyspYvX57ngC8rK0uTJ0/WV199ZRs01qtXT1u2bNGcOXNu2XSTqQAcjZ+fn+Lj42WxWBQUFKTU1FTFx8ff1HS7ubnZDuKkpaVp+PDhmjx5sjp37ixJtrw1DEOPPvqorFar5syZI0mqUKFCoTL4OjIVcCwOdXr5sWPHdPXqVYWEhNjmWa1WBQUFFftnxcXFyWq12h5+fn7F/hkAUBrMmjVLrVq1kre3t9zd3TV37lylp6fnuezRo0d16dIlde7cWe7u7rbHokWLlJaWdsvPIFMBOJq2bdvKYrHYpkNDQ3XkyBFlZ2fnuXxGRoa6d++ubt26adSoUTc9/8orryg5OVmffPJJrjMtC5PB15GpgGNxqKa7JI0ZM0YZGRm2x4kTJ+xdEgAUu2XLlikmJkaRkZFav3699uzZo4EDB+rKlSt5Lp+ZmSlJWr16tfbs2WN7HDhwIN/ruslUAGVZdna2wsPD5enpqblz5970/JIlSxQfH69Vq1apVq1atvmFzeDryFTAsTjU6eX16tVThQoVtGPHDtWpU0fStW8Vv//+e91///0Feg9nZ2dJuuW3lNe5uLjIxcXlzgoGgFLG2dk5V/4lJSWpXbt2GjZsmG1efkesGzVqJBcXF6Wnpxfq+m0yFYCj2bZtW67prVu3KjAwUE5OTjct+8ILLyg1NVU7d+6Uq6trrueSk5P1zDPPaM6cOWrbtm2u5wqbwdeRqYBjcaim28PDQwMGDNCoUaNUtWpVVa9eXbGxsSpXrlyu03/yU7duXVksFn3++ed66KGH5ObmJnd3d5MrB4DSwd/fX9u2bdPx48fl7u6uwMBALVq0SOvWrVNAQIAWL16sHTt2KCAgIM/Xe3h4KCYmRi+88IJycnJ03333KSMjQ0lJSfL09NSAAQNKeI0AwBzp6ekaOXKkhgwZopSUFM2cOVPTpk27abn58+dr9uzZWrVqlSwWi06dOiVJcnd3V2Zmpv7xj3/oiSeeUJcuXWzPOTk5ydvbu9AZDMAxOdzp5dOnT1doaKi6d++uTp06qX379mrYsOFN3yreSq1atTRhwgSNHj1aPj4+ioqKMrliACg9YmJi5OTkpEaNGsnb21tdunTRI488ovDwcLVp00Znz57NdcQlL5MmTdLYsWMVFxenhg0bqmvXrlq9ejWDRABlSv/+/XX58mWFhIRo+PDhGjFihAYPHnzTcps3b1Z2drYefvhh+fr62h5Tp07VoUOHdPr0aS1cuDDXc61bt5YkDRkypNAZDMDxWIzrPzjooC5evKhatWpp2rRpioyMNO1zzp8/L6vVKo2WVLD+HmWIEevQu4nDu77/ZWRkyNPT097loBiQqSWLDMN15GnBhIWFqXnz5rbf4i7tyNTShcy9exQ0Ux3q9HJJ2r17tw4dOqSQkBBlZGTYfmu2Z8+edq4MAAAAAIDcHK7plqSpU6fq8OHDcnZ2VqtWrfTNN9/Iy8vL3mUBAAAAAJCLwzXdLVq00K5du+xdBgAAAMqoxMREe5cAoAxxuBupAQAAAADgKBzuSLe9ZYzhxiMAUFzIVAAoPmQqUDpxpBsAAAAAAJPQdAMAAAAAYBKabgAAAAAATELTDQAAAACASWi6AQAAAAAwCU03AAAAAAAmoekGAAAAAMAk/E53ARmGIUk6f/68nSsB7j7X97vr+yEcH5kK2Ad5WjaRqYB9FDRTaboL6OzZs5IkPz8/O1cC3L0uXLggq9Vq7zJQDMhUwL7I07KFTAXs63aZStNdQFWrVpUkpaen859UEZ0/f15+fn46ceKEPD097V2Ow7mbt59hGLpw4YJq1qxp71JQTBw9U8vC/ujo60D9RUOelk2Onqn24OgZYi9st9wKmqk03QVUrty1y9+tViv/wO6Qp6cn2/AO3K3bj0FE2VJWMrUs7I+Ovg7UX3jkadlTVjLVHhw9Q+yF7fZ/CpKp3EgNAAAAAACT0HQDAAAAAGASmu4CcnFxUWxsrFxcXOxdisNiG94Zth/KEkf/9+zo9UuOvw7UD/wf/j0VHtusaNhuRWMx+M0IAAAAAABMwZFuAAAAAABMQtMNAAAAAIBJaLoBAAAAADAJTTcAAAAAACah6S6gWbNmyd/fX66urmrTpo22b99u75Icxtdff60ePXqoZs2aslgs+vjjj+1dkkOJi4tT69at5eHhoerVq6tXr146fPiwvcsCbquwublixQrdc889cnV1VdOmTbVmzZoSqjRvhal/wYIFslgsuR6urq4lWG1uRcndxMREtWzZUi4uLqpfv74WLFhgep23Utj6ExMTb9r+FotFp06dKpmC/6SouV3a9gE4BsaohcfYtPAYj94Zmu4C+M9//qORI0cqNjZWKSkpCg4OVpcuXXTmzBl7l+YQLl68qODgYM2aNcvepTikzZs3a/jw4dq6dau+/PJLXb16VQ8++KAuXrxo79KAWypsbn777bfq06ePIiMjtXv3bvXq1Uu9evXSvn37Srjya4qS+56enjp58qTt8eOPP5ZgxbkVNnd/+OEHdevWTR07dtSePXsUHR2tZ555RuvWrTO50rwV9f+Nw4cP5/o7qF69ukkV5q8ouV3a9gE4BsaoRcPYtPAYj94hA7cVEhJiDB8+3DadnZ1t1KxZ04iLi7NjVY5JkrFq1Sp7l+HQzpw5Y0gyNm/ebO9SgFsqbG727t3b6NatW655bdq0MYYMGWJqnbdS2Prnz59vWK3WEqqucAqSuy+99JLRuHHjXPPCw8ONLl26mFhZwRSk/k2bNhmSjHPnzpVITYVVkNwubfsAHANj1DvH2LRoGI8WDke6b+PKlSvatWuXOnXqZJtXrlw5derUScnJyXasDHerjIwMSVLVqlXtXAmQt6LkZnJycq7lJalLly52ydmi5n5mZqbq1q0rPz8/9ezZU/v37y+JcotFadr+d6J58+by9fVV586dlZSUZO9ybAqS22Xl7wAlhzEq7InxaOHQdN/Gr7/+quzsbPn4+OSa7+PjY7drxXD3ysnJUXR0tNq3b68mTZrYuxwgT0XJzVOnTpWanC1K/UFBQXrvvff0ySefaMmSJcrJyVG7du30008/lUTJd+xW2//8+fO6fPmynaoqOF9fX7399ttauXKlVq5cKT8/P4WFhSklJcXepRU4t0vTPgDHwBgV9sJ4tPDK27sAAAU3fPhw7du3T1u2bLF3KQBuEBoaqtDQUNt0u3bt1LBhQ82ZM0eTJk2yY2V3h6CgIAUFBdmm27Vrp7S0NMXHx2vx4sV2rIzcBlD2kGuFx5Hu2/Dy8pKTk5NOnz6da/7p06dVo0YNO1WFu1FUVJQ+//xzbdq0SbVr17Z3OcAtFSU3a9SoUWpytjhyv0KFCmrRooWOHj1qRonF7lbb39PTU25ubnaq6s6EhITYffsXJrdL0z4Ax8AYFfbAeLRoaLpvw9nZWa1atdKGDRts83JycrRhw4ZcRzUAsxiGoaioKK1atUobN25UQECAvUsC8lWU3AwNDc21vCR9+eWXdsnZ4sj97OxspaamytfX16wyi1Vp2v7FZc+ePXbb/kXJ7bL4dwBzMUZFSWI8eofsfCM3h7Bs2TLDxcXFWLBggXHgwAFj8ODBRuXKlY1Tp07ZuzSHcOHCBWP37t3G7t27DUnG9OnTjd27dxs//vijvUtzCM8++6xhtVqNxMRE4+TJk7bHpUuX7F0acEu3y81+/foZo0ePti2flJRklC9f3pg6dapx8OBBIzY21qhQoYKRmprqEPVPmDDBWLdunZGWlmbs2rXLeOKJJwxXV1dj//79dqn/drk7evRoo1+/frbljx07ZlSsWNEYNWqUcfDgQWPWrFmGk5OTsXbtWoeoPz4+3vj444+NI0eOGKmpqcaIESOMcuXKGV999ZVd6i9Ibpf2fQCOgTFq0TA2LTzGo3eGpruAZs6cadSpU8dwdnY2QkJCjK1bt9q7JIdx/adc/vwYMGCAvUtzCHltO0nG/Pnz7V0akK/8crNDhw43ZcDy5cuNBg0aGM7Ozkbjxo2N1atXl3DFuRWm/ujoaNuyPj4+xkMPPWSkpKTYoeprbpe7AwYMMDp06HDTa5o3b244Ozsb9erVs2vGFLb+119/3fjLX/5iuLq6GlWrVjXCwsKMjRs32qd4o2C57Qj7ABwDY9TCY2xaeIxH74zFMAzDrKPoAAAAAADczbimGwAAAAAAk9B0AwAAAABgEppuAAAAAABMQtMNAAAAAIBJaLoBAAAAADAJTTcAAAAAACah6QYAAAAAwCQ03QAAAAAAmISmGwAAAAAAk9B0AwAAAABgEppuAAAAAABMQtMNAAAAAIBJ/h94XUHWiI1+iAAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.subplots(1, 3, figsize=(10, 5))\n",
"\n",
"plt.suptitle('Most Predictive Tokens by Class - Positive')\n",
"\n",
"plt.subplot(1,3,1)\n",
"coef_df['amazon'].nlargest(10).sort_values(ascending=True).plot(kind='barh', color='green')\n",
"plt.title('Amazon')\n",
"\n",
"plt.subplot(1,3,2)\n",
"coef_df['rottentomatoes'].nlargest(10).sort_values(ascending=True).plot(kind='barh', color='green')\n",
"plt.title('Rotten Tomatoes')\n",
"\n",
"plt.subplot(1,3,3)\n",
"coef_df['yelp'].nlargest(10).sort_values(ascending=True).plot(kind='barh', color='green')\n",
"plt.title('Yelp')\n",
"\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"id": "6e90d400-547c-4871-87bd-880f406a9c46",
"metadata": {},
"source": [
"As we might expected, words like 'alexa', 'tablet', and 'kindle' are highly predictive of the Amazon class, whereas words like 'food', 'place' and 'delicious' are of the Yelp class, and \"movie-like\" words of the RottenTomatoes class. This makes sense, and also reflects the qualitities of the training data.\n",
"\n",
"Are there any issues with our model, however? What if we look at the most negatively predictive features (tokens) by class?"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "c590b976-9d2f-41d1-bad0-3a3af962c454",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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3zElioyMhKurKxISEmBnZ/fW/sx7xcDcQ++Bea/sYd5TMubMj15p5D1eXk5ERKVm27ZtkMvlsLe3R0JCAkaNGgUXF5diFdxERERE5RGLbiIiKjVPnz7FpEmTcOvWLZibm6Ndu3ZYvHixqsMiIiIiUhoW3UREVGr8/Pzg5+en6jCIiIiISg0fpEZERERERESkJDzTTaQsfEZh+ZeWBhgZqToKopJh7qH3wbxHHxvmTCqFvMcz3URERERERERKwqKbiIiIiIiISElYdBMREREREREpCYtuIiIiIiIiIiVh0U1ERERERESkJCy6iYiIiIiIiJSERTcRERERERGRkrDoJiIiIiIiIlISFt1ERERERERESsKim4iIiIiIiEhJWHQTERERERERKQmLbiIiIiIiIiIlYdFNREREREREpCQsuomIiIiIiIiUhEU3ERERERERkZKw6CYiIiIiIiJSEhbdRERERERERErCopuIiIiIiIhISTRUHQBRhSGTqToCIvqYMQcRERUfcyaVIp7pJiIiIiIiIlISFt1ERERERERESsKim4iIiIiIiEhJWHR/IO7u7hg9enShy21tbbFs2bJSi4eIqDTIZDJs375d1WEQEZUbAQEB6Nq1q6rDIKJSxAeplZIzZ85AX19f1WEQEX1QycnJMDExUXUYRERERGUWi+5SYmFhoeoQiIg+uMqVK6s6BCIiIqIyjZeXf0DZ2dkYPnw4jIyMYG5ujunTp0MIASD/5eVXrlyBq6srdHR0ULduXRw6dIiXaRJRmePu7o6RI0di4sSJMDU1ReXKlTFz5kxp+Zt56/bt2/D19YWpqSn09fXRtGlTREVFSct37NiBxo0bQ0dHBzVr1sSsWbOQnZ1dintERB+TzZs3w8nJCbq6ujAzM0O7du2QkZGB3NxczJ49G1WrVoW2tjYaNWqEffv2SesdPXoUMpkMT548kdpiYmIgk8lw48YNAMDatWthbGyM/fv3w9HREXK5HB07dkRycrK0Tk5ODsaOHQtjY2OYmZlh4sSJ0rEhEX08WHR/QGFhYdDQ0MDp06exfPlyLFmyBKtXr87XLycnB127doWenh6ioqIQGhqKqVOnqiBiIqK3CwsLg76+PqKiorBw4ULMnj0bBw8ezNcvPT0dbm5uuHPnDnbu3InY2FhMnDgRubm5AIDjx4/Dz88Po0aNwuXLlxES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KTRv3hwODg5vHd/e3h5dunTBoEGDEBISAgMDA0yePBlVqlRBly5dSmEPiagii4qKwuHDh9GhQwdYWloiKioKDx48gKOjI2bOnImvv/4alpaW6NSpE54+fYrIyEiMGDGi0PFmzJgBb29vVK9eHT169ICamhpiY2Nx8eJFzJ07F+3atYOzszO6du2KhQsXonbt2rh79y52796Nbt265btcnYg+Xiy6XzN9+nRoaGhgxowZuHv3LqysrPD111/n62dtbY3IyEhMmjQJHTp0QGZmJmxsbNCxY0eoqalBJpNhw4YNGDlyJOrXrw8HBwd8//33cHd3L/2dIiIqgTlz5sDCwgLBwcH4559/YGxsjMaNG+Obb76BmZkZjhw5ggkTJsDNzQ3q6upo1KgRXFxcij3+mjVrMGrUKHh7eyMrKwutW7fGnj173unMORHR6wwNDfHnn39i2bJlSEtLg42NDRYvXoxOnToBAF68eIGlS5di/PjxMDc3R48ePYocz9PTE7t27cLs2bOxYMECaGpqok6dOtIVkTKZDHv27MHUqVPRv39/PHjwAJUrV0br1q0LfPsNEX28ZK8e4kflUVpaGoyMjJCamgpDQ0NVh/Px+f978KniSgNgBPA7VoYw772GOYiUgHmv7GHe+8CYO+kNpZH3+PRyIiIiIiIiIiVh0U1ERERERESkJCy6iYiIiIiIiJSED1Ijeld8HELFl5YGGBmpOgqigjEHkTIw71FFx9xJbyqFvMcz3URERERERERKwqKbiIiIiIiISElYdBMREREREREpCYtuIiIiIiIiIiVh0U1ERERERESkJCy6iYiIiIiIiJSERTcRERERERGRkrDoJiIiIiIiIlISFt1ERERERERESsKim4iIiIiIiEhJWHQTERERERERKQmLbiIiIiIiIiIlYdFNREREREREpCQsuomIiIiIiIiUhEU3ERERERERkZKw6CYiIiIiIiJSEhbdRERERERERErCopuIiIiIiIhISTRUHQBRuSWTqToCIvrYMO8QEZUM8yaVATzTTURERERERKQkLLqJiIiIiIiIlIRFNxEREREREZGSsOgmIiIiIiIiUpIPUnS7u7tj9OjRH2IoIiIqI27cuAGZTIaYmBhVh0JEVGbMnDkTjRo1UnUYRFSO8Ex3CRw9ehQymQxPnjxRdShEREREpALjx4/H4cOHVR0G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rFmYPHkyKlWqhOHDh0NNTQ0bNmzA2bNnUb9+fYwZMwaLFi0qUWyBgYHIysqSXkVBRFQaSpq/rK2tERkZiZycHHTo0AFOTk4YPXo0jI2Noaamhnnz5uHmzZsICQkB8OqS89DQUEybNg2xsbEfJF8SEb2PKlWqYM+ePTh9+jQaNmyIr7/+GoGBgZg2bZpCv7Zt28LU1BTx8fH44osvihxz4MCBWL16NdasWQMnJye4ublh7dq10pluAwMDLFy4EE2bNkWzZs1w48YN7Nmzp9hXWhJR+ScTb95ATaVu3bp1GDNmDO7evStdwl4caWlpMDIyQmpqKgwNDZUYIRWokHvvqeJIA2AE8DtWhnz0eY95h5SMea/s+ejz3vti3qS3KI28V+oPUqP/efbsGZKTkzF//nwMHjy4RAU3ERERERERlX28rkWFFi5ciDp16qBy5cqYMmWKqsMhIiIiIiKiD4xFtwrNnDkTL1++xOHDhyGXy1UdDhEREREREX1gvLyc6F3xcQgVX1oaYGSk6iiI/od5h5SNeY8qGuZNeptSyHs8001ERERERESkJCy6iYiIiIiIiJSERTcRERERERGRkrDoJiIiIiIiIlISFt1ERERERERESsKim4iIiIiIiEhJWHQTERERERERKQmLbiIiIiIiIiIlYdFNREREREREpCQsuomIiIiIiIiUhEU3ERERERERkZKw6CYiIiIiIiJSEhbdRERERERERErCopuIiIiIiIhISVh0ExERERERESkJi24iIiIiIiIiJWHRTURERERERKQkLLqJiIiIiIiIlERD1QEQlVkymaojIKKPHfMQEVHJMG9SGcQz3URERERERERKwqKbiIiIiIiISElYdBMREREREREpCYtuIiIiIiIiIiVh0a1EAQEB6Nq1q6rDICJ6Z+7u7hg9erSqwyAiKnW2trZYtmyZqsMgogqARTcRERERkZLxZAzRx4tFNxERERFVSFlZWaoOgYiIRXced3d3jBgxAqNHj4aJiQkqVaqEVatWISMjA/3794eBgQFq1aqFvXv3AgBycnIQGBiIGjVqQFdXFw4ODli+fHmR2zhz5gwsLCywYMECAMCTJ08wcOBAWFhYwNDQEG3btkVsbKzS95WI6F08fvwYfn5+MDExgZ6eHjp16oRr164BANLS0qCrqyvlyDzbtm2DgYEBnj17BgBISkpC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34iPj0dKSkqhxTkRVTwsut/R4MGD0b17d/Tu3RstWrTAw4cPMXTo0EL7V65cGUeOHMGFCxfQt29f5ObmYs+ePWjdujX69++P2rVro0+fPrh586Z07zgRUVmyZs0aNGnSBN7e3nB2doYQAnv27Ml3G46vry9iY2MVznIDgJ6eHv78809Ur14d3bt3h6OjIwIDA/HixQsYGhqW9u4QUTnl5+eH58+fo3nz5hg2bBhGjRolvRqsII0bN8bGjRuxYcMG1K9fHzNmzMDs2bMREBAg9VmzZg2sra3h5uaG7t2746uvvoKlpaXCOL/++iuys7PRpEkTjB49GnPnzlVYbmZmhiNHjiA9PR1ubm5o0qQJVq1aJeXIQYMGwcHBAU2bNoWFhUW+s+9EVHHJxOs3p1C5kpaWBiMjI6SmpvKAVRlee0gLfZzSABgB/I6VIR9d3mMeolJW1vOeu7s7GjVqhGXLlqk6lFLz0eW998W8SSVUGnmPZ7qJiIiIiIiIlIRFNxEREREREZGS8JVhRERERFQuFPSqVSKiso5FN1Fh+LgDSksD+CorUiXmISptzHtU3jFvUkmVQt7j5eVERERERERESsKim4iIiIiIiEhJWHQTERERERERKQmLbiIiIiIiIiIlYdFNREREREREpCQsuomIiIiIiIiUhEU3ERERERERkZKw6CYiIiIiIiJSEhbdRERERERERErCopuIiIiIiIhISVh0ExERERERESkJi24iIiIiIiIiJWHRTURERERERKQkLLqJiIiIiIiIlIRFNxEREREREZGSsOgmIiIiIiIiUhIW3URERERERERKwqKbiIiIiIiISElYdBMREREREREpiYaqAyD6oGQyVUdARPTumMOIiEqGeZPKAZ7pJiIiIiIiIlISFt1ERERERERESsKim4iIiIiIiEhJWHQTEX0k3N3dMXr06AKXBQQEoGvXru+9DZlMhu3btwMAbty4AZlMhpiYmPcel4joXTDvEVFZwAeplUBAQACePHkiJVYioopi+fLlEEKoOgwiolLDvEdEpYVFtwpkZWVBS0tL1WEQEUmMjIxUHQIRUali3iOi0sLLywuwefNmODk5QVdXF2ZmZmjXrh0mTJiAsLAw7NixAzKZDDKZDEePHgUAXLhwAW3btpX6f/XVV0hPT5fGy7t8ad68ebC2toaDgwNmz56N+vXr59t2o0aNMH369NLaVSL6iO3evRtGRkYIDw/Pd5mlu7s7Ro4ciYkTJ8LU1BSVK1fGzJkzFda/du0aWrduDR0dHdStWxcHDx586zYvXryITp06QS6Xo1KlSujXrx9SUlI+8J4RERWMeY+IVIFF9xuSk5Ph6+uLAQMGIC4uDkePHkX37t0RFBSEXr16oWPHjkhOTkZycjJatWqFjIwMeHp6wsTEBGfOnMGmTZtw6NAhDB8+XGHcw4cPIz4+HgcPHsSuXbuk8c+cOSP1OX/+PP7++2/079+/wNgyMzORlpamMBERvYv169fD19cX4eHh6Nu3b4F9wsLCoK+vj6ioKCxcuBCzZ8+WDjBzc3PRvXt3aGlpISoqCj///DMmTZpU5DafPHmCtm3b4pNPPkF0dDT27duHe/fuoVevXoWuw7xHRB8K8x4RqYwgBWfPnhUAxI0bN/It8/f3F126dFFoCw0NFSYmJiI9PV1q2717t1BTUxP//vuvtF6lSpVEZmamwrqdOnUSQ4YMkeZHjBgh3N3dC40tKChIAMg3paamvsuuVkwAJ04fbEpFxfqOubm5iVGjRokffvhBGBkZiaNHj0rL3sxvbm5uwtXVVWH9Zs2aiUmTJgkhhNi/f7/Q0NAQd+7ckZbv3btXABDbtm0TQghx/fp1AUCcP39eCCHEnDlzRIcOHRTGTEpKEgBEfHx8gTF/dHmvDPzdc/q4J+Y95r1ypwx8bziV76k08h7PdL+hYcOG8PDwgJOTE3r27IlVq1bh8ePHhfaPi4tDw4YNoa+vL7W5uLggNzcX8fHxUpuTk1O++7gHDRqE33//HS9evEBWVhbWr1+PAQMGFLqtKVOmIDU1VZqSkpLeY0+J6GO0efNmjBkzBgcPHoSbm1uRfRs0aKAwb2Vlhfv37wN4lfuqVasGa2trabmzs3OR48XGxiIiIgJyuVya6tSpAwBITEwscB3mPSJ6X8x7RKRqfJDaG9TV1XHw4EH89ddfOHDgAFasWIGpU6ciKirqvcZ9vSjP4+PjA21tbWzbtg1aWlp4+fIlevToUegY2tra0NbWfq84iOjj9sknn+DcuXP49ddf0bRpU8hkskL7ampqKszLZDLk5ua+87bT09Ph4+ODBQsW5FtmZWVV4DrMe0T0vpj3iEjVWHQXQCaTwcXFBS4uLpgxYwZsbGykwjgnJ0ehr6OjI9auXYuMjAypsI6MjISamhocHByK3I6Ghgb8/f2xZs0aaGlpoU+fPtDV1VXafhER2dnZYfHixXB3d4e6ujp++OGHdxrH0dERSUlJSE5Olg4cT506VeQ6jRs3xpYtW2BrawsNDf7vh4hKB/MeEakaLy9/Q1RUFL799ltER0fj1q1b2Lp1Kx48eABHR0fY2tri77//Rnx8PFJSUvDy5Uv07dsXOjo68Pf3x8WLFxEREYERI0agX79+qFSp0lu3N3DgQBw5cgT79u0r8tJyIqIPpXbt2oiIiMCWLVswevTodxqjXbt2qF27Nvz9/REbG4vjx49j6tSpRa4zbNgwPHr0CL6+vjhz5gwSExOxf/9+9O/fP98PmkREHxLzHhGpEn9ye4OhoSH+/PNPLFu2DGlpabCxscHixYvRqVMnNG3aFEePHkXTpk2Rnp6OiIgIuLu7Y//+/Rg1ahSaNWsGPT09fP7551iyZEmxtmdvb49WrVrh0aNHaNGihZL3jojoFQcHBxw5ckQ681NSampq2LZtGwIDA9G8eXPY2tri+++/R8eOHQtdx9raGpGRkZg0aRI6dOiAzMxM2NjYoGPHjlBT42/ARKRczHtEpCqyVw/9I1URQsDe3h5Dhw7F2LFjS7RuWloajIyMkJqaCkNDQyVFWM4UcZ8WUUmlATAC+B0rQyp83mMOIxVj3it7Knzee1/Mm/SeSiPv8Uy3Cj148AAbNmzAv//+W+i7uYmIiIiIiKj8YtGtQpaWljA3N0doaChMTExUHQ4RERERERF9YCy6VYhX9hMREREREVVsLLqpYuEPGfQhpaUBRkaqjoI+JsxhpGrMe1TeMG/S+yqFvMfHJhIREREREREpCYtuIiIiIiIiIiVh0U1ERERERESkJCy6iYiIiIiIiJSERTcRERERERGRkrDoJiIiIiIiIlISFt1ERERERERESsKim4iIiIiIiEhJWHQTERERERERKQmLbiIiIiIiIiIlYdFNREREREREpCQsuomIiIiIiIiUhEU3ERERERERkZKw6CYiIiIiIiJSEhbdRERERERERErCopuIiIiIiIhISVh0ExERERERESkJi24iIiIiIiIiJWHRTURERERERKQkGqoOgKhIMpmqIyAi+rCY14iIiof5kioInukmIiIiIiIiUhIW3URERERERERKwqKbiIiIiIiISElYdBeTra0tli1b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RERERKQkLLqJiIiIiIiIlIT3dP+/o0ePqjoEIiIiIiIiqmBYdFPZxkcOkCqlpQFGRqqOgioa5jUqy5j3qCxhvqTSUAp5j5eXExERERERESkJi24iIiIiIiIiJWHRTURERERERKQkLLqJiIiIiIiIlIRFNxEREREREZGSsOgmIiIiIiIiUhIW3URERERERERKwqKbiIiIiIiISElYdBMREREREREpCYtuIiIiIiIiIiVh0U1ERERERESkJCy6iYiIiIiIiJSERTcRERERERGRkrDoJiIiIiIiIlISFt1ERERERERESsKim4iIiIiIiEhJWHQTERERERERKQmLbiIiIiIiIiIlYdFNREREREREpCQaqg6APiIymaojICIqfcx9REQlw7xJFQzPdBMREREREREpCYtuIiIiIiIiIiVh0U1ERERERESkJCy6i0EIga+++gqmpqaQyWSIiYlRynbc3d0xevRopYxNRPSuAgIC0LVr1yL7MH8REQEzZ85Eo0aNVB0GEZUxLLqLYd++fVi7di127dqF5ORk1K9fX9UhERG9k7JSHK9duxbGxsaqDoOI6IMaP348Dh8+rOowiKiM4dPLiyExMRFWVlZo1aqVqkMhIiIiojJKLpdDLperOgwiKmN4pvstAgICMGLECNy6dQsymQy2trbIzMzEyJEjYWlpCR0dHbi6uuLMmTMK6x07dgzNmzeHtrY2rKysMHnyZGRnZ0vLMzIy4OfnB7lcDisrKyxevLi0d42IPjIBAQE4duwYli9fDplMBplMhsTERAQGBqJGjRrQ1dWFg4MDli9fXuD6s2bNgoWFBQwNDfH1118jKyur0G1lZmZi/PjxqFKlCvT19dGiRQscPXoUAHD06FH0798fqampUhwzZ85Uwh4T0cfM3d0dI0aMwOjRo2FiYoJKlSph1apVyMjIQP/+/WFgYIBatWph79690jpFHb+FhobC2toaubm5Ctvp0qULBgwYAKDgy8tXr14NR0dH6OjooE6dOvjxxx+Vu+NEVPYIKtKTJ0/E7NmzRdWqVUVycrK4f/++GDlypLC2thZ79uwRly5dEv7+/sLExEQ8fPhQCCHE7du3hZ6enhg6dKiIi4sT27ZtE+bm5iIoKEgad8iQIaJ69eri0KFD4u+//xbe3t7CwMBAjBo1qtixpaamCgAiNTX1A++1kgCcOJWrKRUQ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JiIiIiIiIlISFt1ERERERERESsKim4iIiIiIiEhJWHQTERERERERKQmLbiIiIiIiIiIlYdFNREREREREpCQsuomIiIiIiIiUhEU3ERERERERkZKw6CYiIiIiIiJSEhbdRERERERERErCopuIiIiIiIhISVh0ExERERERESkJi24iIiIiIiIiJWHRTURERERERKQkLLqJiIiIiIiIlIRFNxEREREREZGSsOgmIiIiIiIiUhINVQdAKiSTqToCIqLyjXmUiOjtmCvpI8cz3URERERERERKwqKbiIiIiIiISElYdBMREREREREpCYvuUjJz5kw0atRI1WEQERERUQGKc6wWEBCArl27lko8RFRxsOguJePHj8fhw4dVHQYRERERFYDHakSkLHx6eSmRy+WQy+WqDoOIiIiICsBjNSJSlo/yTLe7uztGjBiB0aNHw8TEBJUqVcKqVauQkZGB/v37w8DAALVq1cLevXuldY4dO4bmzZtDW1sbVlZWmDx5MrKzswEAoaGhsLa2Rm5ursJ2unTpggEDBgAo+JKl1atXw9HRETo6OqhTpw5+/PFH5e44EZVp+/btg6urK4yNjWFmZgZvb28kJiYCAHr06IHhw4dLfUePHg2ZTIYrV64AALKysqCvr49Dhw4BAHJzcxEcHIwaNWpAV1cXDRs2xObNm6X1Hz9+jL59+8LCwgK6urqwt7fHmjVrpOUXLlxA27ZtoaurCzMzM3z11VdIT0+XluddYvntt9+iUqVKMDY2xuzZs5GdnY0JEybA1NQUVatWVRgTAJKSktCrVy8YGxvD1NQUXbp0wY0bNz74Z0lE9Ka3Ha+9eayWk5ODsWPHSjl54sSJEEIorPu2XAsUfQxJRB+Hj7LoBoCwsDCYm5vj9OnTGDFiBIYMGYKePXuiVatWOHfuHDp06IB+/frh2bNnuHPnDry8vNCsWTPExsbip59+wi+//IK5c+cCAHr27ImHDx8iIiJCGv/Ro0fYt28f+vbtW+D2w8PDMWPGDMybNw9xcXH49ttvMX36dISFhZXK/hNR2ZORkYGxY8ciOjoahw8fhpqaGrp164bc3Fy4ubnh6NGjUt9jx47B3Nxcajtz5gxevnyJVq1aAQCCg4Px22+/4eeff8alS5cwZswYfPnllzh27BgAYPr06bh8+TL27t2LuLg4/PTTTzA3N5fi8PT0hImJ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AUBaWhqMRiNWrFiBy5cvw9/fH/369cMbb7wBAPDw8EBqaiquXLkCLy8vxMTEID09HQDg7e2NL774AnPnzsWzzz4Lb29vjBs37on/Kejt7Y1///vfWLhwIcaOHYuKigq0b98eQ4YMsfrMNxHRk7L2eG3+/PkoLS1FUlIStFotXn75Zfzud7+DyWRS5nlc1lp7DElErk3z8wUFqTkym80wGAwwmUxNO2D9n4t6EFFdZgAGoOltjGzuiXPP1pij5GKYe87H6XKvKZiV5MTskXv8XgsRERERERGRStjpJiIiIiIiIlIJO91EREREREREKuGF1Foy/pyf6NHMZsBgcHQV5MyYo+RqmHukBmYlOTM75B7PdBMRERERERGphJ1uIiIiIiIiIpWw001ERERERESkEna6iYiIiIiIiFTCTjcRERERERGRStjpJiIiIiIiIlIJO91EREREREREKmGnm4iIiIiIiEgl7HQTERERERERqYSdbiIiIiIiIiKVsNNNREREREREpBJ2uomIiIiIiIhUwk43ERERERERkUrY6SYiIiIiIiJSCTvdRERERERERCphp5uIiIiIiIhIJex0ExEREREREamEnW4iIiIiIiIilbDTTURERERERKSSVo4ugOxIo3F0BURE9sXcI6KWhrlH5HR4ppuIiIiIiIhIJex0ExEREREREamEnW4iIiIiIiIilbDT3UQigqlTpyIgIAAajQb+/v549dVXlcc7duyI999/32H1EREREVHTTJ48GWPGjHnkPIMHD7Y49iMiagg73U30+eefY8uWLdi/fz9KS0tx8eJFpKWlObosIqJmITMzExqNBrdu3XJ0KUTk4pylc7xlyxb4+/s7ugwicgBevbyJioqK0LZtW0RHRzu6FCIiu7l//z48PDwcXQYRERFRs8Ez3U0wefJkzJ49GyUlJdBoNOjYseNj/4uq0Wjw17/+FSNGjIC3tze6d++O7OxsFBYWYvDgwfDx8UF0dDSKiorstyNE1OJVVFQgMTERPj4+aNu2LdasWWORZx07dkRaWhomTZoEvV6PqVOnAgCOHj2KmJgYeHl5ISQkBHPmzMHt27eV9X7yyScYMGAA/Pz8EBwcjIkTJ6KsrAwAcOXKFfzmN78BALRu3RoajQaTJ0+2634TUcswefJkHDlyBGvXroVGo4FGo0FRURGSk5PRqVMneHl5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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.subplots(1, 3, figsize=(10, 5))\n",
"\n",
"plt.suptitle('Most Predictive Tokens by Class - Negative')\n",
"\n",
"plt.subplot(1,3,1)\n",
"coef_df['amazon'].nsmallest(10).sort_values(ascending=True).plot(kind='barh', color='red')\n",
"plt.title('Amazon')\n",
"\n",
"plt.subplot(1,3,2)\n",
"coef_df['rottentomatoes'].nsmallest(10).sort_values(ascending=True).plot(kind='barh', color='red')\n",
"plt.title('Rotten Tomatoes')\n",
"\n",
"plt.subplot(1,3,3)\n",
"coef_df['yelp'].nsmallest(10).sort_values(ascending=True).plot(kind='barh', color='red')\n",
"plt.title('Yelp')\n",
"\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"id": "530d03ce-a237-4145-a603-2426d14a8d4c",
"metadata": {},
"source": [
"We can see that the words which are positively predictive for one class are generally in the list of most negatively predictively for the other classes (as each review must belong to one of the three classes). This reflects the nature (bias) of our training data set. From this learning in the MVP, it might make more sense to build a system with individual models for predicting each class if the number of classes is low, or to try using a dataset with a larger number of categories for tagging the site reviews with and see if these issues are addressed in the model training."
]
},
{
"cell_type": "markdown",
"id": "873cbf62-25b2-4ef3-9a97-45c3aa109b93",
"metadata": {
"id": "uOsXgUYiwmCW"
},
"source": [
"